在 Swift 中将布尔值转换为整数值

问题描述 投票:0回答:9

我正在从 Swift 2 转换到 Swift 3。我注意到我无法在 Swift 3 中将布尔值转换为整数值。

let p1 = ("a" == "a") //true

print(true)           //"true\n"
print(p1)             //"true\n"

Int(true)             //1

Int(p1)               //error

例如,这些语法在 Swift 2 中运行良好。但在 Swift 3 中,

print(p1)
会产生错误。

错误是

error: cannot invoke initializer for type 'Int' with an argument list of type '((Bool))'

我明白为什么会发生错误。谁能解释这种安全的原因是什么以及如何在 Swift 3 中从 Bool 转换为 Int?

swift swift3 integer boolean
9个回答
68
投票

您可以使用三元运算符将 Bool 转换为 Int:

let result = condition ? 1 : 0
如果

result

为真,
condition
将为1,如果
condition
为假,则为0。


62
投票

斯威夫特 5

布尔 -> 整数

extension Bool {
    var intValue: Int {
        return self ? 1 : 0
    }
}

整数 -> 布尔

extension Int {
    var boolValue: Bool {
        return self != 0 
    }
}

21
投票

试试这个,

let p1 = ("a" == "a") //true
print(true)           //"true\n"
print(p1)             //"true\n"

Int(true)             //1

Int(NSNumber(value:p1)) //1

13
投票

编辑——从评论中的对话来看,下面的第二种方法(Int.init 重载)更符合 Swift 的风格。

或者,如果这是您在应用程序中经常做的事情,您可以创建一个协议并扩展您需要使用它转换为

Int
的每种类型。

extension Bool: IntValue {
    func intValue() -> Int {
        if self {
            return 1
        }
        return 0
    }
}

protocol IntValue {
    func intValue() -> Int
}

print("\(true.intValue())") //prints "1"

编辑-为了涵盖 Rob Napier 在下面的评论中提到的案例示例,可以这样做:

extension Int {
    init(_ bool:Bool) {
        self = bool ? 1 : 0
    }
}

let myBool = true
print("Integer value of \(myBool) is \(Int(myBool)).")

5
投票

斯威夫特 5.4

这是一种更通用的方法,适用于其他类型,而不仅仅是 Int。

extension ExpressibleByIntegerLiteral {
    init(_ booleanLiteral: BooleanLiteralType) {
        self = booleanLiteral ? 1 : 0
    }
}

let bool1 = true
let bool2 = false

let myInt = Int(bool1) // 1
let myFloat = Float(bool1) // 1
let myDouble = Double(bool2) // 0
let myCGFloat = CGFloat(bool2) // 0

1
投票

您可以使用 hashValue 属性:

let active = true
active.hashValue // returns 1
active = false
active.hashValue // returns 0

1
投票

unsafeBitCast
总是一个选择

let int: Int = Int(unsafeBitCast(someBool, to: UInt8.self))

0
投票

在 swift 3.2 和 swift 4 中测试

不需要转换成Int

试试这个 -

let p1 = ("a" == "a") //true

print(true)           //"true\n"
print(p1)             //"true\n"

Int(true)             //1

print(NSNumber(value: p1))   

0
投票

swift 5:

你可以这样做:

let x = ("a" == "a")

Int(truncating: x as NSNumber)
© www.soinside.com 2019 - 2024. All rights reserved.