如何在第一次加载时处理设置而不会崩溃

时间:2017-12-12 04:42:42

标签: ios swift

我第一次加载我的应用程序时需要在我的设置中设置一些值,但是当我加载设置时,应用程序崩溃,因为我的设置试图用当前值填充自己...所有这些都是一些nullpointer或其他什么。在这种特定情况下,我试图显示UIPickerView的内容。

 var possibleDigit = Int(SettingsManager.shared.zoneVibrateCounts[0])

SettingsManager.shared.zoneVibrateCounts包含一个包含值的数组。首次加载时无论如何都不会填充数组。我需要的是能够在我尝试访问其数据之前检查SettingsManager.shared.zoneVibrateCounts是否有任何内容。我该怎么办?是否需要更多代码?

修改

这是声明我的arrayOfZoneVibrations

var arrayOfZoneVibrations: [Int]!

func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {

    if pickerView.tag == 1
    {
           SettingsManager.shared.timerDelay = row + 1
    timerDelayTextField.text = getTitle(row)
            timerDelayTextField.resignFirstResponder()
    }
    else
    {
        arrayOfZoneVibrations[pickerView.tag - 2] = row + 1
        SettingsManager.shared.zoneVibrateCounts = arrayOfZoneVibrations
    }

}

以下是我访问SettingsManager部分的方法

var zoneVibrateCounts: [Int] {
    get {
        return  uDefaults.array(forKey: ZONES)  as? [Int] ?? [Int]()
    }
    set (value) {
        uDefaults.set(value, forKey: ZONES)
    }
}

以下是ZONES的定义

private let ZONES               = "zones"

1 个答案:

答案 0 :(得分:1)

没有理由使用Int(SettingsManager.shared.zoneVibrateCounts[0]),因为SettingsManager.shared.zoneVibrateCounts[0]已经是Int。所以这可以简单地写成:

var possibleDigit = SettingsManager.shared.zoneVibrateCounts[0]

现在,由于SettingsManager.shared.zoneVibrateCounts可能是一个空数组,因此您需要避免直接访问不存在的索引。

如果您只是想要一些默认值(例如0),如果数组为空,那么您应该这样做:

var possibleDigit = SettingsManager.shared.zoneVibrateCounts.first ?? 0

您可以随意替换0之后的??,无论您的应用是什么默认值。

如果您不想使用默认值,但是如果错误为空则想要采取不同的操作,那么您应该这样做:

if let firstCount = SettingsManager.shared.zoneVibrateCounts.first {
    // do something with firstCount
} else {
    // the array is empty, act accordingly
}

或者你可以这样做:

guard let firstCount = SettingsManager.shared.zoneVibrateCounts.first else {
    return
}

// do something with firstCount