ios - Float、Double、Int 是 AnyObject 吗?

标签 ios swift swift2

我阅读了 Swift 的内联文档,但有点困惑。

1) Any 是所有类型都隐式遵守的协议(protocol)。

2) AnyObject 是所有类都隐式遵守的协议(protocol)。

3) Int, Float, Double 都是结构体

这是一个示例代码:

import UIKit

func passAnyObject(param: AnyObject) {
    print(param)
}

class MyClass {}
struct MyStruct {}

let a: Int = 1
let b = 2.0
let c = NSObject()
let d = MyClass()
let e = MyStruct()

passAnyObject(a)
passAnyObject(b)
passAnyObject(c)
passAnyObject(d)
//passAnyObject(e) // Argument type 'MyStruct' does not conform to expected type 'AnyObject'


if a is AnyObject { // b, d, e is also AnyObject
    print("\(a.dynamicType) is AnyObject")
}

我不明白的是为什么IntDoubleFloatAnyObject?为什么编译器什么都不说?这些类型被声明为结构。结构 MyStruct 不能传递给顶部的方法,因为它不符合 AnyObject

你能帮我理解为什么 IntDoubleFloatAnyObject 或者为什么编译器认为它们是?

最佳答案

因为您导入了 Foundation,IntDoubleFloat 在传递给时会转换为 NSNumber采用 AnyObject 的函数。类型 String 被转换为 NSString。这样做是为了在调用基于 CocoaCocoa Touch 的界面时让生活更轻松。如果您删除 import UIKit(或 import Cocoa for OS X),您将看到:

error: argument type 'Int' does not conform to expected type 'AnyObject'

当你打电话时

passAnyObject(a)

描述了值类型到对象的这种隐式转换 here.


Swift 3 更新(Xcode 8 beta 6):

IntDoubleStringBool 传递给 AnyObject 类型的参数 现在会导致错误,例如 Argument of type 'Int' does not conform to expected type 'AnyObject'

在 Swift 3 中,隐式类型转换已被移除。现在需要将 IntDoubleStringBool 转换为 as AnyObject 为了将它传递给 AnyObject 类型的参数:

let a = 1
passAnyObject(a as AnyObject)

关于ios - Float、Double、Int 是 AnyObject 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32554357/

相关文章:

iOS 相机问题 (Swift)

ios - swift 2 : Issue when initializing a UIActivityViewController in Swift: Type of expression is ambiguous without more context

ios - 在 uitableview 中使用多种单元格类型的问题

ios - NSInvalidArgumentException 使用 UISegmentedControl

iOS - 通过动画将搜索栏从中心移动到导航栏下方(Swift)

ruby - 安装cocoapod时获取 "don' t有写权限

ios - UICollection 水平滚动,因此减少单元格项目之间的空间

ios - 如何直接从 Storyboard中的第一个导航 Controller 快速执行 segue?

ios - Swift - UIProgressView 对角线填充

ios - 使用 Xib 的参数构建 UIView 的优雅方式