2016-03-01 29 views
0

我想檢查一個對象的類型,它可以是for循環中的各種結構,但是我在兩邊都收到錯誤。這裏是我的代碼:Swift:檢查對象類型在循環中

for object in objectArray { 

    if object is structType 
    { 
     .... 
    } 
} 

我得到的錯誤是在如果聲明。編譯器說,條件將始終評估爲true。 爲什麼?

如果我使用對象:任何技術在for循環,那麼任何子的內檢查是否抱怨說,任何聲明拒絕我檢查之類的東西object.name聲稱對象不能有子屬性,如名稱

我的代碼正在發送一個隨機的結構類型到一個要處理的函數,並且基於發現的類型,我需要深入探討對象的不同屬性。

有沒有更好的方法來做到這一點?

+0

我通常用'如果令x =對象去了? structType {x.name ...}',但我沒有在這方面與結構合作過。 – Mattias

回答

1

這取決於objectArray的定義。

如果objectArray被定義爲一個給定Struct的數組(然後我們說這個[Cat]),然後你檢查一個元素是否是Cat,當然編譯器會告訴你它永遠是真的。

也許你想這樣的事情

struct Cat { } 
struct Dog { } 
struct Lion { } 

let animals:[Any] = [Cat(), Dog(), Lion()] 

for animal in animals { 
    switch animal { 
    case let cat as Cat: print("It's a cat") 
    case let dog as Dog: print("It's a dog") 
    case let lion as Lion: print("It's a lion") 
    default: fatalError() 
    } 
} 
+0

謝謝!今晚就試試吧! –

+0

在你的例子中,我得到一個編譯器警告,你的例子中的「貓」沒有被使用,並且我應該考慮用「_」替換它是正常的嗎? –

+0

@MarkLöwe:是的......只是用它或者用_ –

2

我得到的錯誤是在if語句中。編譯器說這個條件總會被評估爲真。爲什麼?

這意味着objectArray的對象類型是structType。否則,這是xCode中的一個錯誤(它發生在我身上)。

如果我使用的對象:for循環中的任何技術,然後任何子檢查如果抱怨任何聲明拒絕我檢查像object.name東西聲明對象不能有子屬性,如作爲名字。

在訪問方法之前,您首先需要將對象轉換爲structType,否則編譯器將不知道它擁有屬性。作爲@mattias的建議,我會做

if let myStruct = object as? structType { 
    print("\(myStruct.name)") 
} 

此外,如果你有很多的結構(比如超過2),並且它們具有類似的性質,我會建議您使用的協議,以避免if let小號

一個巨大的列表
+0

很好的說明!非常感謝你的幫助! –