Чтобы выяснить, что происходит с Int(false)
, изменить его на:
Int.init(false)
, а затем вариант -Click на init
. Вы увидите, что он называет этот инициализатор:
init(_ number: NSNumber)
Поскольку false
является действительным NSNumber
и NSNumber
соответствует протоколу ExpressibleByBooleanLiteral
, Swift находит этот инициализатор.
Так почему же не эта работа ?:
let emptyString = false
Int(emptyString)
Потому что теперь вы пропускании Bool
напечатал переменной и Int
не имеет инициализатора, который принимает Bool
.
В Swift 2 это сработало бы потому, что Bool
был автоматически подключен к NSNumber
, но был удален.
Вы можете заставить это так:
import Foundation // or import UIKit or import Cocoa
Int(emtpyString as NSNumber)
Это работает только, если Фонд импортируется. Разумеется, в Pure Swift нет NSNumber
.
Это не разрешено в swift 3. – Dili
Я не думаю, что это дублируется, вопрос «почему», а не «как». Название вопроса должно быть отредактировано. –