AnyObject 与 Struct(任何)

AnyObject vs. Struct (Any)

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

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

    //...
}

但是我不能,因为CGRectCGSizestruct,不符合AnyObjectprotocol。那么,关于如何做到这一点有什么想法吗?

使用 Any 而不是 AnyObject

Swift provides two special type aliases for working with non-specific types:

AnyObject can represent an instance of any class type.
Any can represent an instance of any type at all, including function types.

The Swift Programming Language

@nkukushkin 的回答是正确的,但是,如果您想要的是一个根据传递的是 CGRect 还是 CGStruct 而表现不同的函数,您最好重载:

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

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

相比之下,Any 效率低下(将结构转换为 Any 并返回,如果在紧密循环中经常执行此操作可能会产生很大影响),并且不会-typesafe(你可以将任何东西传递给那个函数,它只会在运行时失败)。

如果您的目的是将两种类型强制转换为通用类型,然后对其执行相同的操作,您可以创建采用该类型的第三个重载,并让其他两个重载调用它。

刚刚发现了一种更好的方法。 Swift 有一个名为 dump 的方法,它适用于多种数据。

例如:

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

将打印:

{x 0 y 5 w 30 h 60}

如果你只需要打印一个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)}"
    }
}