在Swift中将String转换为Bool - 通过API或大多数类似Swift的方法

And*_*ing 60 boolean swift

是否有API将布尔值的大多数可能的String表示形式(例如"True","true","False","false","yes","no","1","0")转换为Bool在斯威夫特?

如果没有,那么从头开始编码这个最类似Swift的方法是什么?它是一个功能map()操作吗?或者是其他东西?

这个实例中的原始源数据是JSON,但我对以尽可能类似Swift的方式解决问题的关键感兴趣,因此在此过程中学习更多关于语言的知识.

Kir*_*ins 82

AFAIK没有内置方式.与标准类似的方法toInt()可以是:

extension String {
    var bool: Bool? {
        switch self.lowercased() {
        case "true", "t", "yes", "y", "1":
            return true
        case "false", "f", "no", "n", "0":
            return false
        default:
            return nil
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 我已经在开关中添加了一个"switch self.lowercased()",因为你不能指望值总是在正确的外壳中.func toBool() - > Bool?{switch self.lowercased(){case"true","yes","1":返回true case"false","no","0":return false default:return nil}} (9认同)
  • 这最好作为计算属性。只需将 `func toBool() -> Bool?` 替换为 `var bool: Bool?` (2认同)

Duy*_*Hoa 38

在objective-C中,我们有一个String的bo​​olValue.如果Swift中不存在,您可以将字符串转换为NSString然后使用它

var aString = NSString(string: "tRue")

var b = aString.boolValue
Run Code Online (Sandbox Code Playgroud)

如果aString.upperCase =="TRUE",b应该返回true

更新: for 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.
Run Code Online (Sandbox Code Playgroud)

更新2:我使用扩展方法对此方法进行了性能测试.这种方法的表现令人印象深刻.这是我测试的代码,我在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)")

}
Run Code Online (Sandbox Code Playgroud)

控制台日志:

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
Run Code Online (Sandbox Code Playgroud)

我们可以通过简化规则来提高扩展解决方案的性能.性能取决于我们如何实施规则.


Nic*_*ini 32

类型转换以及一个很好的String扩展,你就可以运行了

extension String {
var boolValue: Bool {
    return NSString(string: self).boolValue
}}
Run Code Online (Sandbox Code Playgroud)

  • 我想说这是一个甜蜜的解决方案......但唯一的问题是,对于任何*不能*翻译成布尔值的东西(例如“dog”,“cat”,“xyz”),它也会返回“false” )。对于这种情况,您可能需要“nil” (2认同)

小智 13

用这个,

self.boolType = NSString(string:stringType!).boolValue
Run Code Online (Sandbox Code Playgroud)


Par*_*ara 8

正如已经建议的那样,我将构建一个扩展String,仅列出您想要转换为的字符串文字,truefalse保留nil不转换的内容(或者false在这种情况下也返回?你的选择!).顺便说一下,您可能不希望您的方法区分大小写.

例如:

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
Run Code Online (Sandbox Code Playgroud)

如果您使用NSString对象及其boolValue()方法,请小心,因为它true遇到"Y","y","T","t"或数字1-9时返回(请参阅此处的文档).

举个例子:

let nsString = NSString(string: "tFalse")
nsString.boolValue // true
Run Code Online (Sandbox Code Playgroud)


Iva*_*lab 8

我认为最简单的方法是:

let someString = "true"
let convertedBool = Bool(someString) ?? false
Run Code Online (Sandbox Code Playgroud)


jan*_*lsb 6

我采用了Nicolas Manzini的解决方案,并对其进行了一些修改。我建议使用强制转换运算符,因为它在String和NSString之间桥接。尚不清楚它是否是免费的桥梁,但是它应该比盲目创建新对象具有更好的性能。

extension String {

    var boolValue: Bool {
        return (self as NSString).boolValue
    }
}
Run Code Online (Sandbox Code Playgroud)


fut*_*dam 6

没有其他答案涉及完整或混合大写字符串的潜力。那么为什么不接受 Kirsteins 的回答,将它与一些计算属性魔法和 shazam 混合在一起:

extension String {
    var bool: Bool? {
        let lowercaseSelf = self.lowercased()

        switch lowercaseSelf {
        case "true", "yes", "1":
            return true
        case "false", "no", "0":
            return false
        default:
            return nil
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

用法是:

let trueBoolString = "TRUE"   // or "True", "true", "YES", "yEs", and so on
print(trueBoolString.bool)    // true
Run Code Online (Sandbox Code Playgroud)