AnyObject vs. Struct(Any)

Pau*_*sar 8 struct any ios swift anyobject

我想为我的项目创建一个这样的方法:

func print(obj: AnyObject) {
    if let rect = obj as? CGRect {
        println(NSStringFromCGRect(rect))
    }
    else if let size = obj as? CGSize {
        println(NSStringFromCGSize(size))
    }

    //...
}
Run Code Online (Sandbox Code Playgroud)

但我不能因为CGRectCGSizestructS和不符合AnyObject protocol.那么,关于如何做到这一点的任何想法?

Nik*_*kin 10

Any而不是AnyObject.

Swift提供了两种特殊类型的别名,用于处理非特定类型:

AnyObject可以表示任何类类型的实例.
Any可以表示任何类型的实例,包括函数类型.

Swift编程语言


Air*_*ity 5

@ nkukushkin的答案是正确的,但是,如果你想要的是一个行为不同的函数,取决于它是通过a CGRect还是a CGStruct,你最好重载:

func print(rect: CGRect) {
    println(NSStringFromCGRect(rect))
}

func print(size: CGSize) {
    println(NSStringFromCGSize(size))
}
Run Code Online (Sandbox Code Playgroud)

相比之下,这Any将是效率低下的(将结构转换为Any返回,如果你在紧密循环中执行此操作会产生很大影响),并且非类型安全(您可以将任何内容传递给该函数,并且它只会在运行时失败).

如果您打算将两种类型强制转换为公共类型,然后对其执行相同的操作,则可以创建采用该类型的第3次重载,并让其他两种类型调用它.