Преобразование значения Boolean в Integer в swift 3

Я преобразовывал из 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))'

Я понимаю, почему происходят ошибки. Может ли кто-нибудь объяснить, в чем причина этой безопасности и как конвертировать из Bool в Int в swift 3?

Ответы

Ответ 1

Попробуй это,

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

Int(true)             //1

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

Ответ 2

Вы можете использовать тернарный оператор для преобразования Bool в Int:

let result = condition ? 1 : 0

result будет равен 1, если condition истинно, 0 - condition false.

Ответ 3

Swift 4

Bool → Int

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

Int → Bool

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

Ответ 4

EDIT. Из разговоров в комментариях становится понятнее, что второй способ сделать это ниже (перегрузка 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"

EDIT- Чтобы привести пример примера, упомянутого Роба Напире в комментариях ниже, можно сделать примерно следующее:

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

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

Ответ 5

Вы можете использовать свойство hashValue:

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

Ответ 6

Протестировано быстрым 3,2 и быстрым 4

Нет необходимости преобразовывать его в Int

Попробуй это -

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

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

Int(true)             //1

print(NSNumber(value: p1))   

Ответ 7

let boolAsInt = <#yol bool #>? 1: 0