铸造任何?为 Int、String 或 Bool
Casting Any? to Int, String or Bool
我在 Swift 中有一个函数 returns 有吗?值,我想将结果(基于值类型)转换为 Bool、String 或 Int。
函数是这个:
static func value(forKey: SettingKeys) -> Any? {
return settingManager.settings.filter({[=10=].key == forKey.rawValue}).first?.value
}
然后当我这样做时:
let printingEnabled = AppSettings().value(forKey:"printingEnabled") as? Int
我得到零。如果没有转换,该值为 Optional("1")。当我尝试将结果转换为 String 或 Int 时类似。知道如何将结果转换为我选择的类型吗?
谢谢。
您不希望 return Any?
的函数。这是一种噩梦。相反,您想使用泛型来确保该值是您想要的类型。例如:
static func value<T>(ofType: T.Type, forKey: SettingKeys) -> T? {
return settingManager.settings.filter({[=10=].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?
,并且是 Optional(1)
正如预期的那样。我没有看到它是 nil
的任何情况。但是我也不能让你的代码像写的那样编译,因为不清楚 SettingKeys
和 settings
是,所以我的代码可能与你的有很大不同。)
我在 Swift 中有一个函数 returns 有吗?值,我想将结果(基于值类型)转换为 Bool、String 或 Int。
函数是这个:
static func value(forKey: SettingKeys) -> Any? {
return settingManager.settings.filter({[=10=].key == forKey.rawValue}).first?.value
}
然后当我这样做时:
let printingEnabled = AppSettings().value(forKey:"printingEnabled") as? Int
我得到零。如果没有转换,该值为 Optional("1")。当我尝试将结果转换为 String 或 Int 时类似。知道如何将结果转换为我选择的类型吗?
谢谢。
您不希望 return Any?
的函数。这是一种噩梦。相反,您想使用泛型来确保该值是您想要的类型。例如:
static func value<T>(ofType: T.Type, forKey: SettingKeys) -> T? {
return settingManager.settings.filter({[=10=].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?
,并且是 Optional(1)
正如预期的那样。我没有看到它是 nil
的任何情况。但是我也不能让你的代码像写的那样编译,因为不清楚 SettingKeys
和 settings
是,所以我的代码可能与你的有很大不同。)