2015-04-01 40 views
8

我想創建這樣的方法爲我的項目: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 S和不符合AnyObject 。那麼,關於如何做到這一點的任何想法?

回答

5

@ nkukushkin的答案是正確的,但是,如果你想要的是表現不同上無論是通過視功能的CGRectCGStruct,你是超載更好:

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

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

相比之下,Any將效率低下(將結構轉換爲Any並返回,如果您在緊密循環中執行此操作可能會產生很大影響),而非類型安全(y你可以將任何東西傳遞給該函數,並且它只會在運行時失敗)。

如果您的意圖是強制將這兩種類型轉換爲常見類型,然後對其執行相同的操作,則可以創建一個採用該類型的第三個重載,並讓其他兩個稱爲它。

+0

這是非常好的。出於某種原因,我完全忘記了方法超載.. – 2015-04-01 13:35:53

9

使用Any而不是AnyObject

雨燕提供了兩種特殊類型的別名與非特異性 類型的工作:

AnyObject可以代表任何類類型的實例。
Any可以表示任何類型的實例,包括函數類型。

The Swift Programming Language

2

剛剛發現了一個更好的方法。 Swift有一個方法叫做轉儲,它可以處理很多種數據。

例如:

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

會打印:

{x 0 y 5 w 30 h 60} 
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)}" 
    } 
} 
+0

是的,那是真的。但是我認爲「dump」和「NSStringFromCGRect」會產生一個更容易閱讀的格式。你知道爲什麼嗎? – 2015-04-03 20:48:08

+0

您是否在使用遊樂場來測試您的代碼?我相信你的代碼'dump(CGRectMake(0,5,30,60))'實際上只是向你展示操場上'CGRect'的預覽。嘗試代碼'let rect = CGRect(x:0,y:5,width:30,height:60); dump(rect)',你應該得到與'println(rect)'相同的格式。 – ABakerSmith 2015-04-03 22:11:19

+0

我已經更新了我的答案,以討論如何在使用'println'時改變格式。 – ABakerSmith 2015-04-03 22:12:30