AnyObject vs. Struct(Any)

时间:2015-04-01 13:18:02

标签: ios swift struct any anyobject

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

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

    //...
}

但我不能,因为CGRectCGSizestruct并且不符合AnyObject protocol。那么,关于如何做到这一点的任何想法?

4 个答案:

答案 0 :(得分:10)

使用Any代替AnyObject

  

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

     

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

The Swift Programming Language

答案 1 :(得分:5)

@ nkukushkin的答案是正确的,但是,如果你想要的是一个功能,根据它是通过CGRect还是CGStruct而表现不同,你最好是重载:

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

func print(size: CGSize) {
    println(NSStringFromCGSize(size))
}

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

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

答案 2 :(得分:2)

刚刚发现了一种更好的方法。 Swift有一个名为 dump 的方法,它可以处理很多种类的数据。

例如:

dump(CGRectMake(0, 5, 30, 60))

将打印:

{x 0 y 5 w 30 h 60}

答案 3 :(得分:1)

如果您只需要打印CGRectCGSize,则可以使用:

println(rect)

println(size)

你离开了一个' ...'在函数结束时,我假设您需要打印更多类型。为此,您需要使这些类型符合Printable协议(除非他们已经这样做)。以下是

的示例
class Car { 
    var mileage = 0
}

extension Car : Printable {
    var description: String { 
        return "A car that has travelled \(mileage) miles."
    }
}

你可以使用:

let myCar = Car()
println(myCar)

此外,您可能想要更改当前打印类型的格式。例如,如果您希望println(aRect)的格式与NSStringFromCGRect返回的格式相同,则可以使用扩展程序:

extension CGRect : Printable {
    public var description: String {
        return "{\(origin.x), \(origin.y)}, {\(size.width), \(size.height)}"
    }
}