我想为我的项目创建一个这样的方法:
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
。那么,关于如何做到这一点的任何想法?
答案 0 :(得分:10)
使用Any
代替AnyObject
。
Swift提供了两种特殊类型的别名,用于处理非特定的别名 类型:
•
AnyObject
可以表示任何类类型的实例 •Any
可以表示任何类型的实例,包括函数类型。
答案 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)
如果您只需要打印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)}"
}
}