2016-11-29 3 views
3

Код, приведенный ниже:Почему Int (false) работает, но Int (booleanVariable) нет?

Int(false) // = 1, it's okay 

//but when I try this 
let emptyString = true //or let emptyString : Bool = true 
Int(emptyString) //error - Cannot invoke initializer with an argument list of type '(Bool)' 

Может кто-нибудь объяснить этот факт? Это сбивает с толку. Что происходит внутри?

+2

Это не разрешено в swift 3. – Dili

+1

Я не думаю, что это дублируется, вопрос «почему», а не «как». Название вопроса должно быть отредактировано. –

ответ

4

Чтобы выяснить, что происходит с 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.

+2

Возможно, добавьте, что для этого требуется, чтобы Foundation был включен, 'Int (false)' не будет компилироваться в чистой среде Swift. –

+1

Спасибо!Это отличный ответ :) –

+0

@MartinR, вопрос «Foundation» - я могу скомпилировать это на быстрой игровой площадке с «import UIKit» –

0

Попробуйте

let intValue = emptyString ? 1 : 0 

Update

Вы хотите использовать Int(), используйте этот

Int(NSNumber(value:emptyString)) 
+3

Да, я знаю об этом, спасибо. Но я заинтересован в том, чтобы понять факт в моем вопросе :) –

+0

Прохладный. Вы не можете преобразовать int в bool, как это, если вам нужно преобразовать в NSNumber надеюсь, что это помогает – Dili

+0

Но почему я могу преобразовать 'false' или 'true' в Int (false)? –

0

Int не имеет инициализатора с Bool в качестве аргумента.

0

Вы уверены, что вы не имеете что-то вроде этого где-то в вашем коде:

extension Int : ExpressibleByBooleanLiteral { 
    public init(booleanLiteral: BooleanLiteralType) { 
     self = booleanLiteral ? 1 : 0 
    } 
} 

Потому что в противном случае, линия как let foo = Int(false) не следует компилировать.

Смежные вопросы