铸造了吗?转换为Int,String或Bool

时间:2018-09-07 14:22:04

标签: swift casting downcast

我在Swift中有一个返回Any的函数?值,我想将结果(基于值类型)转换为Bool,String或Int。

功能是这样的:

static func value(forKey: SettingKeys) -> Any? {
    return settingManager.settings.filter({$0.key == forKey.rawValue}).first?.value
}

然后当我这样做时:

let printingEnabled = AppSettings().value(forKey:"printingEnabled") as? Int

我得到零。如果不进行强制转换,则值为Optional(“ 1”)。当我尝试将结果转换为String或Int时类似。关于如何将结果转换为自己选择的类型的任何想法?

谢谢。

1 个答案:

答案 0 :(得分:2)

您不希望函数返回Any?。这是一场噩梦。相反,您想使用泛型来确保值是您想要的类型。例如:

static func value<T>(ofType: T.Type, forKey: SettingKeys) -> T? {
    return settingManager.settings.filter({$0.key == forKey.rawValue}).first?.value as? T
}

那么这将是:

let printingEnabled = AppSettings().value(ofType: Int.self, forKey:"printingEnabled")

printingEnabled在这种情况下将为Int?

当然,您也可以将其包装在以下帮助器中:

static func int(forKey: SettingKeys) -> Int? {
    return value(ofType: Int.self, forKey: forKey)
}

(顺便说一句,虽然您确实想避免使用Any?并且使用这种方法,但我实际上无法重现您的问题。printingEnabled对我来说是Int?,对{ {1}}符合预期。我看不到它是Optional(1)的情况,但是我也无法使您的代码像编写的那样编译,因为不清楚nil和{{1 }}是,所以我的代码可能与您的代码大不相同。)