我刚刚完成将这个项目转换为Swift 2并且有大量的可选修复程序。所以自然会出现一些运行时问题。控制台提供通常的可选错误消息。我有一个数据模型和其他类,但我很难找到问题。到目前为止,我认为只有这一个问题。你能否建议适当的可选声明/解包。我知道他们的意思但是因为我相当绿,所以即使我知道选项的定义,我也需要展示要解决的问题。我意识到导航窗口中的图像是可选项。它们肯定存在,所以它们应该被打开。那么nickname
或SpaceObject
类会出现问题吗?
SpaceObject.swift
class SpaceObject: NSObject {
var name: String?
var gravitationalForce: Float?
var diameter: Float?
var yearLength: Float?
var dayLength: Float?
var temperature: Float?
var numberOfMoons: Int?
var nickname: String?
var interestingFact: String?
var spaceImage: UIImage?
override init() {
}
init(initWithData data:NSDictionary, andImage image:UIImage) {
if (data[PLANET_NAME] != nil) { self.name = String(format: data[PLANET_NAME] as! NSString as String) }
if (data[PLANET_GRAVITY] != nil) { self.gravitationalForce = Float(data[PLANET_GRAVITY] as! NSNumber) }
if (data[PLANET_DIAMETER] != nil) { self.diameter = Float(data[PLANET_DIAMETER] as! NSNumber) }
if (data[PLANET_YEAR_LENGTH] != nil) { self.yearLength = Float(data[PLANET_YEAR_LENGTH] as! NSNumber) }
if (data[PLANET_DAY_LENGTH] != nil) { self.dayLength = Float(data[PLANET_DAY_LENGTH] as! NSNumber) }
if (data[PLANET_TEMPERATURE] != nil) { self.temperature = Float(data[PLANET_TEMPERATURE] as! NSNumber) }
if (data[PLANET_NUMBER_OF_MOONS] != nil) { self.numberOfMoons = Int(data[PLANET_NUMBER_OF_MOONS] as! NSNumber) }
if (data[PLANET_NICKNAME] != nil) { self.nickname = String(format: data[PLANET_NICKNAME] as! NSString as String) }
if (data[PLANET_INTERESTING_FACT] != nil) { self.interestingFact = String(format: data[PLANET_INTERESTING_FACT] as! NSString as String) }
self.spaceImage = image
}
}
SpaceDataViewController.swift
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("DataCell", forIndexPath: indexPath) as UITableViewCell
switch indexPath.row {
case 0:
cell.textLabel!.text = "Nickname:"
if let nickname = self.spaceObject?.nickname {
cell.detailTextLabel!.text = "\(nickname)"
}
case 1:
cell.textLabel!.text = "Diameter (km):"
if let diameter = self.spaceObject?.diameter {
cell.detailTextLabel!.text = "\(diameter)"
}
case 2:
cell.textLabel!.text = "Gravitational Force:"
if let gravitationalForce = self.spaceObject?.gravitationalForce {
cell.detailTextLabel!.text = "\(gravitationalForce)"
}
case 3:
cell.textLabel!.text = "Length of a Year (in days):"
if let yearLength = self.spaceObject?.yearLength {
cell.detailTextLabel!.text = "\(yearLength)"
}
case 4:
cell.textLabel!.text = "Length of a Day (in hours):"
if let dayLength = self.spaceObject?.dayLength {
cell.detailTextLabel!.text = "\(dayLength)"
}
case 5:
cell.textLabel!.text = "Temperature (in celsius):"
if let temperature = self.spaceObject?.temperature {
cell.detailTextLabel!.text = "\(temperature)"
}
case 6:
cell.textLabel!.text = "Number of Moons:"
if let numberOfMoons = self.spaceObject?.numberOfMoons {
cell.detailTextLabel!.text = "\(numberOfMoons)"
}
case 7:
cell.textLabel!.text = "Interesting Fact:"
if let interestingFact = self.spaceObject?.interestingFact {
cell.detailTextLabel!.text = "\(interestingFact)"
}
default: break
}
return cell
OuterSpaceTableViewController.swift
override func viewDidLoad() {
super.viewDidLoad()
for planetData in AstronomicalData.allKnownPlanets() {
let imageName = "\(planetData[PLANET_NAME]).jpg"
let planet = SpaceObject(initWithData: planetData as! NSDictionary, andImage: UIImage(named: imageName)!) // Mercury.jpg is an optional
self.planets += [planet]
}
if let spaceList = self.userDefaults.arrayForKey(ADDED_SPACE_OBJECTS_KEY) {
for spaceObjectItem in spaceList {
self.addedSpaceObjects += [self.spaceObjectForDictionary(spaceObjectItem)]
}
}
}
Swift-Strings-Extension.swift
extension String {
// Convert string to floats.
func toFloat() -> Float? {
return (self as NSString).floatValue
}
}
答案 0 :(得分:0)
您发布的错误的解决方法是打开从字典中提取的行星名称字符串。由于它是一个可选项,它将值返回为"可选(Mercury)"。因此,当您不打开时,图像名称将形成为"可选(Mercury).jpg"这显然不会在您的资源文件夹中提供。
示例:
for planetData in AstronomicalData.allKnownPlanets {
if let planetName = planetData[PLANET_NAME] as! String {
let imageName = "\(planetName).jpg" //Now it will be Mercury.jpg
}
//...
}
如果您在此之后发现更多错误,则应根据具体情况处理。