Ответ 1
Попробуй это,
let p1 = ("a" == "a") //true
print(true) //"true\n"
print(p1) //"true\n"
Int(true) //1
Int(NSNumber(value:p1)) //1
Я преобразовывал из 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?
Попробуй это,
let p1 = ("a" == "a") //true
print(true) //"true\n"
print(p1) //"true\n"
Int(true) //1
Int(NSNumber(value:p1)) //1
Вы можете использовать тернарный оператор для преобразования Bool в Int:
let result = condition ? 1 : 0
result
будет равен 1, если condition
истинно, 0 - condition
false.
Bool → Int
extension Bool {
var intValue: Int {
return self ? 1 : 0
}
}
Int → Bool
extension Int {
var boolValue: Bool {
return self != 0
}
}
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)).")
Вы можете использовать свойство hashValue:
let active = true
active.hashValue // returns 1
active = false
active.hashValue // returns 0
Протестировано быстрым 3,2 и быстрым 4
Нет необходимости преобразовывать его в Int
Попробуй это -
let p1 = ("a" == "a") //true
print(true) //"true\n"
print(p1) //"true\n"
Int(true) //1
print(NSNumber(value: p1))
let boolAsInt = <#yol bool #>? 1: 0