Преобразование Int в Bool
В Swift 2.x я считаю, что могу:
let number = 1
let result = Bool(number)
print(result) // prints out: true
Но так как Swift 3 мне не удалось это сделать, и это дает мне ошибку:
Невозможно вызвать инициализатор для типа "Bool" с списком аргументов type '(Int)'
В настоящее время я использую расширение для преобразования Int
в Bool
, но мне было интересно, не существует ли встроенная опция для этого.
Ответы
Ответ 1
Нет, существует и никогда не была явная встроенная опция для преобразования Int
в Bool
, см. ссылку на язык для Bool
для более подробной информации.
Однако существует, однако, инициализатор NSNumber
. Разница заключается в том, что неявный мост между числовым типом Swift и NSNumber
был удален в Swift 3 (что ранее допускало то, что казалось явным Bool
путем Int
инициализации). Вы все равно можете получить доступ к этому с помощью инициализатора NSNumber
, явно выполнив преобразование от Int
до NSNumber
:
let number = 1
let result = Bool(number as NSNumber)
print(result) // true
Как пишет @Hamish в своем комментарии ниже: если мы оставим тему инициализаторов и просто сосредоточимся на конечном результате (создание экземпляра Bool
с учетом значения экземпляра Int
), мы можем просто использовать !=
для значений Int
(в частности, оператор с сигнатурой func !=(lhs: Int, rhs: Int) -> Bool
), обобщение, легко достигаемое с помощью операторного подхода !=
:
let number = -1
let result = number != 0
print(result) // true
Как и вы, а также @JAL в своем ответе, вы можете создать свой собственный Bool
через Int
инициализатор, но вы также можете рассмотрите обобщение этого для любого типа, соответствующего протоколу Integer
:
extension Bool {
init<T: Integer>(_ num: T) {
self.init(num != 0)
}
}
/* example usage */
let num1: Int8 = -1
let num2: Int = 3
let num3: UInt64 = 0
// ....
let result1 = Bool(num1) // true
let result2 = Bool(num2) // true
let result3 = Bool(num3) // false
Ответ 2
Нет логического инициализатора, который принимает Int
, только NSNumber
. Раньше Int
неявно перекрывался до NSNumber
через Foundation, но это было удалено в Swift 3.
Вы можете сделать что-то вроде:
let result = Bool(number as NSNumber)
Или вы можете расширить Bool
и создать пользовательский init, который принимает Int:
extension Bool {
init(_ number: Int) {
self.init(number as NSNumber)
}
}
Ответ 3
Swift 3
Попробуйте это
extension Integer {
var boolValue: Bool { return self != 0 }
}
использование
let number = 2
print(number.boolValue)
let items = ["1"]
print(items.count.boolValue)
Ответ 4
Я использую Xcode 9.0.1 и Swift 3.0.
let result = (number as NSNumber).boolValue
который работает очень хорошо для меня.
Ответ 5
Swift 4
func validateInput(with aString: String,regularExpression:String ) -> Bool { // Example regex (Phone number): "^([+-]{1})([0-9]{3})$"
var error: Error? = nil
let regex = try? NSRegularExpression(pattern: regularExpression, options: .caseInsensitive)
if error != nil {
print("error \(String(describing: error))")
}
let numberOfMatches: Int! = regex?.numberOfMatches(in: aString, options: [], range: NSRange(location: 0, length: (aString.count ))) ?? 0
return numberOfMatches > 0
}