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))
}
//...
}
但是我不能,因为CGRect
和CGSize
是struct
,不符合AnyObject
protocol
。那么,关于如何做到这一点有什么想法吗?
使用 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.
@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}
如果你只需要打印一个CGRect
或CGSize
,你可以使用:
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)}"
}
}
我想为我的项目创建这样的方法:
func print(obj: AnyObject) {
if let rect = obj as? CGRect {
println(NSStringFromCGRect(rect))
}
else if let size = obj as? CGSize {
println(NSStringFromCGSize(size))
}
//...
}
但是我不能,因为CGRect
和CGSize
是struct
,不符合AnyObject
protocol
。那么,关于如何做到这一点有什么想法吗?
使用 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.
@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}
如果你只需要打印一个CGRect
或CGSize
,你可以使用:
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)}"
}
}