将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的bo​​olValue。 您可以将您的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的扩展,只列出你想转换为truefalse的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"