Преобразование 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
}