2016-11-29 63 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

这是不允许在迅速3. – Dili

+1

我不认为它是重复的,问题是“为什么”,而不是“如何”。问题的标题应该被编辑。 –

回答

4

要了解正在发生的事情与Int(false),将其更改为:

Int.init(false) 

然后选项 - 点选init。你会看到,它调用此初始化:

init(_ number: NSNumber) 

由于false是有效NSNumberNSNumber符合协议ExpressibleByBooleanLiteral,斯威夫特认为这初始化。

那么,为什么不这项工作?:

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,关于'基金会'的问题 - 我可以用'导入UIKit'在swift游戏场编译这个' –

0

试试这个

let intValue = emptyString ? 1 : 0 

更新

你想使用int(),使用此

Int(NSNumber(value:emptyString)) 
+3

是的,我知道这件事,谢谢。但我的兴趣是要了解我的问题:) –

+0

很酷。你不能像这样将int转换为bool,如果你需要转换为NSNumber,希望这有助于 – Dili

+0

但是为什么我可以通过Int(false)转换'false'或'true'? –

0

Int没有初始化器与Bool作为参数。

0

你确定你不会有这样的事情在某处你的代码:

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

因为否则,像let foo = Int(false)行不应该编译。

相关问题