Как избежать этого Force Cast - PullRequest
0 голосов
/ 07 ноября 2018

Я думаю, что принудительное приведение, которое у меня есть в приложении, приводит к сбою, (userDefaults.value (forKey: "timeDiffSecondsDefault") как! Int?) ... но я действительно не знаю, как этого избежать , Любое руководство с благодарностью!

func getProductionTime(store: Bool = false) {

    let userDefaults = UserDefaults.standard

    let productionTimeFormatter = DateFormatter()
    productionTimeFormatter.timeZone = TimeZone(abbreviation: defaultTimeZone)
    productionTimeFormatter.dateFormat = defaultTimeFormat

    if let defaultTimeDiffSeconds: Int = userDefaults.value(forKey: "timeDiffSecondsDefault") as! Int? {
        timeDiffSeconds = defaultTimeDiffSeconds
    }
    let productionTime = Calendar.current.date(byAdding: .second, value: timeDiffSeconds, to: Date())!
    if store {
        storeDateComponents(nowProdTime: productionTime)
    }
    productionTimeString = productionTimeFormatter.string(from: productionTime)
    liveCounterButton.setTitle(productionTimeString, for: .normal)

}

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

Когда ключ отсутствует, вы пытаетесь принудительно привести пустое Any? к Int?, и, таким образом, условие if не выполняется:

if let defaultTimeDiffSeconds: Int = userDefaults.value(forKey: "timeDiffSecondsDefault") as! Int? {
    timeDiffSeconds = defaultTimeDiffSeconds
}

И if timeDiffSecondsне был инициализирован в другом месте, это вызовет сбой при попытке его использовать.

Подходящим способом будет условное приведение с as?:

if let defaultTimeDiffSeconds = userDefaults.object(forKey: "timeDiffSecondsDefault") as? Int { ... }

object(forKey:) любезно предложил Мистер Леонардо .

Использование userDefaults.integer(forKey: "timeDiffSecondsDefault") может привести к путанице при использовании timeDiffSeconds позже, поскольку integer(forKey:) вернет 0, если ключ отсутствуетв пользовательских значениях по умолчанию и возвращает целое число, даже если значение является строкой или логическим значением.

0 голосов
/ 07 ноября 2018

Используйте выделенный API, который возвращает необязательный

timeDiffSeconds = userDefaults.integer(forKey: "timeDiffSecondsDefault")

Если требуется значение по умолчанию! = 0 зарегистрировать it.


Примечание: Никогда не используйте value(forKey с UserDefaults, если вам действительно не нужен KVC

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...