为什么我可以 return 一个带有 return 类型 AnyObject 的布尔值?使用 UIKit 而不是使用 Darwin
Why can I return a bool with return type AnyObject? with UIKit and not with Darwin
我正在输入一些 Swift 代码,因为我很无聊并且有一段时间没有编程 Swift。
为什么当我包含 UIKit 时这段代码可以工作
import UIKit
public class foo {
private var boolTest : Bool?
init() {
boolTest = true
}
public func call() -> AnyObject? {
if let bool = boolTest {
return bool
}
else {
return nil
}
}
}
foo().call()
当我导入 Darwin 而不是 UIKit 时,它不起作用。
import Darwin
public class foo {
private var boolTest : Bool?
init() {
boolTest = true
}
public func call() -> AnyObject? {
if let bool = boolTest {
return bool
}
else {
return nil
}
}
}
foo().call()
除了我将 UIKit 更改为 Darwin 之外,它的代码完全相同。
错误提示无法 return 向 AnyObject 键入 bool?
当我包含 UIKit 时它没有给出错误消息。
那么有人知道是什么原因造成的吗?
Foundation
添加从 Bool
到 NSNumber
的自动桥接(这是一个 AnyObject
)。
extension Bool : _ObjectiveCBridgeable {
public init(_ number: NSNumber)
}
UIKit
导入 Foundation
和 Darwin
,而 Darwin
仅导入其子模块(如 MacTypes
)。
Bool
Objective-C 桥仅在 Foundation
中声明
extension Bool : _ObjectiveCBridgeable {
public init(_ number: NSNumber)
}
import Foundation
let a: AnyObject = true
print(a, a.dynamicType) // 1 __NSCFBoolean
let b: Bool = true
print(b, b.dynamicType) // true Bool
有些本土swift和Objective C之间有'free bridging'。我个人讨厌这种 'automatic' 桥接,相反,如果你需要混合 swift 和 Objective C,它可以帮助你编写 'cleaner' 代码。有很多可用的代码,其中 'free bridging' 是不需要的功能的来源。我建议您尽可能多地使用原生 swift 类型。我真的不明白为什么有人需要将布尔值分配给 AnyObject 类型的变量....
检查这个 'smart' 结构
a as! NSObject == 1 // true
//a == true // error !!!!!!
a as! NSObject == true // true
//a == b as AnyObject // error !!
//a as Bool == b // error
a as! Bool == b // true
a as! UInt == 1 // true
a as! Double == 1 // true
我正在输入一些 Swift 代码,因为我很无聊并且有一段时间没有编程 Swift。
为什么当我包含 UIKit 时这段代码可以工作
import UIKit
public class foo {
private var boolTest : Bool?
init() {
boolTest = true
}
public func call() -> AnyObject? {
if let bool = boolTest {
return bool
}
else {
return nil
}
}
}
foo().call()
当我导入 Darwin 而不是 UIKit 时,它不起作用。
import Darwin
public class foo {
private var boolTest : Bool?
init() {
boolTest = true
}
public func call() -> AnyObject? {
if let bool = boolTest {
return bool
}
else {
return nil
}
}
}
foo().call()
除了我将 UIKit 更改为 Darwin 之外,它的代码完全相同。 错误提示无法 return 向 AnyObject 键入 bool?
当我包含 UIKit 时它没有给出错误消息。
那么有人知道是什么原因造成的吗?
Foundation
添加从 Bool
到 NSNumber
的自动桥接(这是一个 AnyObject
)。
extension Bool : _ObjectiveCBridgeable {
public init(_ number: NSNumber)
}
UIKit
导入 Foundation
和 Darwin
,而 Darwin
仅导入其子模块(如 MacTypes
)。
Bool
Objective-C 桥仅在 Foundation
extension Bool : _ObjectiveCBridgeable {
public init(_ number: NSNumber)
}
import Foundation
let a: AnyObject = true
print(a, a.dynamicType) // 1 __NSCFBoolean
let b: Bool = true
print(b, b.dynamicType) // true Bool
有些本土swift和Objective C之间有'free bridging'。我个人讨厌这种 'automatic' 桥接,相反,如果你需要混合 swift 和 Objective C,它可以帮助你编写 'cleaner' 代码。有很多可用的代码,其中 'free bridging' 是不需要的功能的来源。我建议您尽可能多地使用原生 swift 类型。我真的不明白为什么有人需要将布尔值分配给 AnyObject 类型的变量....
检查这个 'smart' 结构
a as! NSObject == 1 // true
//a == true // error !!!!!!
a as! NSObject == true // true
//a == b as AnyObject // error !!
//a as Bool == b // error
a as! Bool == b // true
a as! UInt == 1 // true
a as! Double == 1 // true