String to Bool

Hi,

I found out about SE because of a very simple coding issue, that seemed odd.

I found myself needing to convert a string representing a boolean to a Bool. It seemed straight-forward enough, and yet myBoolString.boolValue and Bool(myBoolString) were not available, and by searching on SO, I found that I needed to convert via NSString,

let myBool = (self as NSString).boolValue

This seemed rather odd to me, and I'm wondering why such a basic conversion isn't possible in Swift directly.

Any insights appreciated. Thanks.

Bool has an initializer that takes a String: Apple Developer Documentation

3 Likes

Thank you @suyashsrijan, that makes more sense than going via NSString.

Except that Bool only takes true or false. If the string contains 0 or 1, it returns nil. This is why I tend to use:

let myBool = (self as NSString).boolValue

It will allow you to convert these:

let myBool1 = ("0" as NSString).boolValue
let myBool2 = ("NO" as NSString).boolValue
let myBool3 = ("No" as NSString).boolValue
let myBool4 = ("False" as NSString).boolValue
let myBool5 = ("FALSE" as NSString).boolValue
let myBool6 = ("01" as NSString).boolValue
let myBool7 = ("YES" as NSString).boolValue
let myBool8 = ("Yes" as NSString).boolValue
let myBool9 = ("True" as NSString).boolValue
let myBool10 = ("TRUE" as NSString).boolValue

Something to keep in mind.

2 Likes

Are these any good?

// 1
extension Bool {
    init(from: String) {
        self = (from as NSString).boolValue
    }
}

let booboo = Bool(from: "01")

// 2
extension Bool: ExpressibleByStringLiteral {
    public init(stringLiteral value: String) {
        self = (value as NSString).boolValue
    }
}

let ural: Bool = "01"

// 3
extension String {
    var boolValue: Bool { (self as NSString).boolValue }
}

let blah = "NO".boolValue

#2 + #3?

extension String{

    static let bools = [

        "true"  :true,

        "True"  :true,

        "TRUE"  :true,

        "yes"   :true,

        "YES"   :true,

        "1"     :true,

        "false" :false,

        "False" :false,

        "FALSE" :false,

        "no"    :false,

        "NO"    :false,

        "0"     :false

    ]



    public func toBool()->Bool?{

        return String.bools[self]

    }
}

In this case, we could streamline the whole thing to this:

extension Bool {
    init?(description: String) {
        switch description.lowercased() {
        case "true", "yes", "1": self = true
        case "false", "no", "0": self = false
        default: return nil
        }
    }
}
1 Like