"init" устарел" предупреждение после Swift4 convert

В Swift3 я ранее преобразовал Bool в Int, используя следующий метод

let _ = Int(NSNumber(value: false))

После преобразования в Swift4 я получаю предупреждение "init" устарел "предупреждение". Как еще это сделать?

Ответ 1

С Swift 4.2 и Swift 5 вы можете выбрать одно из 5 следующих решений для решения вашей проблемы.


# 1. Использование NSNumber intValue

import Foundation

let integer = NSNumber(value: false).intValue
print(integer) // prints 0

# 2. Использование литья типов

import Foundation

let integer = NSNumber(value: false) as? Int
print(String(describing: integer)) // prints Optional(0)

# 3. Использование Int init(exactly:) инициализатора

import Foundation

let integer = Int(exactly: NSNumber(value: false))
print(String(describing: integer)) // prints Optional(0)

В качестве альтернативы предыдущему коду, вы можете использовать более краткий код ниже.

import Foundation

let integer = Int(exactly: false)
print(String(describing: integer)) // prints Optional(0)

# 4. Использование init(truncating:) Int init(truncating:)

import Foundation

let integer = Int(truncating: false)
print(integer) // prints 0

# 5. Использование потока управления

Обратите внимание, что следующие примеры кодов не требуют импорта Foundation.

Использование № 1 (если выражение):

let integer: Int
let bool = false

if bool {
    integer = 1
} else {
    integer = 0
}
print(integer) // prints 0

Использование № 2 (троичный оператор):

let integer = false ? 1 : 0
print(integer) // prints 0

Ответ 2

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

let x = NSNumber(value: false).intValue

Вы также можете использовать init?(exactly number: NSNumber) initializer:

let y = Int(exactly: NSNumber(value: false))

или, как упоминалось в комментариях @Hamish, числовой инициализатор был переименован в init(truncating:)

let z = Int(truncating: NSNumber(value: false))

или пусть Xcode неявно создает NSNumber из него, как указано @MartinR

let z = Int(truncating: false)

Другой вариант, который у вас есть, - это расширить протокол BinaryInteger (Swift 4) или Integer (Swift3) и создать свой собственный не ошибочный инициализатор, который принимает параметр Bool as и возвращает исходный тип с использованием тройного оператора, как это предлагается в комментариях @vadian

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

let a = Int(true)   // 1
let b = Int(false)  // 0

let c = UInt8(true)  // 1
let d = UInt8(false) // 0