runtime lldb crash - 数据模型的可选/解包问题

时间:2015-12-05 02:24:09

标签: swift

我刚刚完成将这个项目转换为Swift 2并且有大量的可选修复程序。所以自然会出现一些运行时问题。控制台提供通常的可选错误消息。我有一个数据模型和其他类,但我很难找到问题。到目前为止,我认为只有这一个问题。你能否建议适当的可选声明/解包。我知道他们的意思但是因为我相当绿,所以即使我知道选项的定义,我也需要展示要解决的问题。我意识到导航窗口中的图像是可选项。它们肯定存在,所以它们应该被打开。那么nicknameSpaceObject类会出现问题吗?

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
}

}

enter image description here

enter image description here

enter image description here

enter image description here

1 个答案:

答案 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
    }

    //...
}

如果您在此之后发现更多错误,则应根据具体情况处理。