将string转换为Swift中的Bool – 通过API或最Swift的方法
是否有API将布尔值的最可能的string表示(例如“True”,“true”,“False”,“false”,“yes”,“no”,“1”,“0”)转换为Bool在Swift中?
如果不是的话,那么从头开始编写这个最类似Swift的方法是什么? 它会是一个function性的map()操作吗? 或者是其他东西?
这个实例中的原始数据是JSON,但是我感兴趣的是以最类似Swift的方式解决问题的关键,从而在这个过程中学习更多的语言。
没有build立方式AFAIK。 标准toInt()
类似方法可以是:
extension String { func toBool() -> Bool? { switch self { case "True", "true", "yes", "1": return true case "False", "false", "no", "0": return false default: return nil } } }
在Objective-C中,我们有一个String的boolValue。 您可以将您的string转换为NSString,然后使用它,如果它不存在于Swift中
var aString = NSString(string: "tRue") var b = aString.boolValue
b应该返回true如果aString.upperCase ==“TRUE”
更新: Info(刚刚在Apple API中看到):
var boolValue: Bool { get } // Skips initial space characters (whitespaceSet), or optional -/+ sign followed by zeroes. Returns YES on encountering one of "Y", "y", "T", "t", or a digit 1-9. It ignores any trailing characters.
更新2:我用扩展方法做了这个方法的性能testing。 这种方法的performance是印象深刻的。 这里是我的testing代码,我已经使用模拟器一个接一个地在GCD线程中调用了这些函数。
dispatch_async(dispatch_queue_create("com.haduyenhoa.test", nil), { self.test1() self.test2() }) func test1() { let testTrue: String = "TRue" let testFalse: String = "faLse" let testNil: String = "whoops!" let begin : NSDate = NSDate() NSLog("BEGIN native") var testTrueObjC: NSString var testFalseObjC : NSString var testNilObjC:NSString for index in 1...100000 { testTrueObjC = NSString(string:testTrue) testFalseObjC = NSString(string:testFalse) testNilObjC = NSString(string:testNil) var b1 = testTrueObjC.boolValue // {Some true} var b2 = testFalseObjC.boolValue // {Some false} var b3 = testNilObjC.boolValue // nil } let end : NSDate = NSDate() let interval = end.timeIntervalSinceDate(begin) NSLog("DURATION native: \(interval)") } func test2() { let testTrue: String = "TRue" let testFalse: String = "faLse" let testNil: String = "whoops!" let begin : NSDate = NSDate() NSLog("BEGIN extension") for index in 1...100000 { var b1 = testTrue.boolValue() // {Some true} var b2 = testFalse.boolValue() // {Some false} var b3 = testNil.boolValue() // nil } let end : NSDate = NSDate() let interval = end.timeIntervalSinceDate(begin) NSLog("DURATION extension: \(interval)") }
控制台日志:
2015-03-12 14:16:23.238 testSwift3[2343:298787] BEGIN native 2015-03-12 14:16:23.543 testSwift3[2343:298787] DURATION native: 0.305041968822479 2015-03-12 14:16:23.543 testSwift3[2343:298787] BEGIN extension 2015-03-12 14:16:35.360 testSwift3[2343:298787] DURATION extension: 11.8166469931602
通过简化规则,我们可以提高扩展解决scheme的性能。 performance取决于我们如何执行规则。
随着一个漂亮的string扩展types转换,你开始运行
extension String { var boolValue: Bool { return NSString(string: self).boolValue }}
用这个,
self.boolType = NSString(string:stringType!).boolValue
正如已经提到的那样,我会build立一个String
的扩展,只列出你想转换为true
和false
的string文字,对于什么不转换(或者在这种情况下返回false
,保留一个nil
情况?你的select! )。 顺便说一下,你可能不希望你的方法是区分大小写的。
例如:
extension String { func boolValue() -> Bool? { let trueValues = ["true", "yes", "1"] let falseValues = ["false", "no", "0"] let lowerSelf = self.lowercaseString if contains(trueValues, lowerSelf) { return true } else if contains(falseValues, lowerSelf) { return false } else { return nil } } } let testTrue: String = "TRue" testTrue.boolValue() // {Some true} let testFalse: String = "faLse" testFalse.boolValue() // {Some false} let testNil: String = "whoops!" testNil.boolValue() // nil
如果使用NSString
对象及其boolValue()
方法,请小心,因为如果遇到“Y”,“y”,“T”,“t”或数字1-9( 请参阅文档 ),则返回true
。
举个例子:
let nsString = NSString(string: "tFalse") nsString.boolValue // true
var st = "false" extension String { func toBool() -> Bool{ if self == "false" { return false }else{ return true } } } if st.toBool() == false { println("its ok") }
可选string的一行解决scheme
let value:String? = "put some string or even just nil here" let trueOrFalse = NSString(string: value ?? "").boolValue
我重构@Kirsteins代码作为Bool初始值与string值
extension Bool { init?(string: String) { switch string { case "True", "true", "yes", "1": self = true case "False", "false", "no", "0": self = false default: return nil } } } // tests let one = Bool(string: "SDASD") // nil let two = Bool(string: "0") // false let three = Bool(string: "true") // true let four = Bool(string: "null") // nil
从上面的结论回答:
你可以对简单的一行扩展和使用。
Swift 3
extension String { func boolValueFromString() -> Bool { return NSString(string: self).boolValue } }
用法
if (dictCardData.value(forKey: "isadmin") as! String).boolValueFromString() { // Stuff }
如果你使用一次,试试这个。
let str:String = "1" var boo:Bool = str == "1" || str == "true" || str == "True" || str == "yes"