为什么我可以 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 添加从 BoolNSNumber 的自动桥接(这是一个 AnyObject)。

extension Bool : _ObjectiveCBridgeable {
    public init(_ number: NSNumber)
}

UIKit 导入 FoundationDarwin,而 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