2015-03-02 54 views
2

我有一組動物。我想搜索它的某個子類的類型。動物數組將只包含每個子類類型中的一個。我已經嘗試了以下,這是行不通的。我收到一個編譯錯誤,指出:「animalType不是一個類型」。提供類型的對象搜索數組

public static func getAnimal<T: Animal>(animalType: T.type) -> Animal { 
    for animal in self.animals { 
     if animal is animalType { 
      return animal 
     } 
    } 
} 

這可能在Swift中嗎?

我會想稱呼其爲這樣的......

AnimalServices.getAnimal(Dog) 
+0

你可以做一個如果讓作爲一種類型投,如果它失敗,那麼動物是不是這種類型 – Ian 2015-03-02 18:53:52

+0

我只是試過。 「if let a = animal as animalType {}」編譯器仍然抱怨animalType不是一個類型。我是在修補語法嗎? – lionpants 2015-03-02 18:56:26

回答

3

下面是一個簡單的例子,注意我返回一個可選的動物,因爲搜索可能會失敗(編譯器不知道你將永遠有這種類型的只是一種動物):

class Animal { 
    let name: String 

    init(name: String) { 
     self.name = name 
    } 
} 

class Cat: Animal { 
    init() { 
     super.init(name: "Cat") 
    } 
} 

class Dog: Animal { 
    init() { 
     super.init(name: "Dog") 
    } 
} 

struct Zoo { 
    static var animals: [Animal] = [] 

    static func getAnimal<T: Animal>(animalType: T.Type) -> Animal? { 
     for animal in animals { 
      if animal is T { 
       return animal 
      } 
     } 
     return nil 
    } 
} 

Zoo.animals.append(Cat()) 

Zoo.getAnimal(Cat) // Returns the cat as optional 
Zoo.getAnimal(Dog) 

簡單地說, T是您的通用類型。 T.Type說明你正在傳遞一個T型參數。

+0

我很近。 ;)這正是我想要的。謝謝! – lionpants 2015-03-02 20:02:54

+0

或者作爲一個不錯的單行語句:'return animals.filter {$ 0 is T} .first'。雖然性能較差。 – Rengers 2015-03-02 20:26:20

0

你不能用一個未知類型使用isas語法。那種你正在尋找可以使用NSObject中的kindOfClass方法,只要Animal做的反射式的是NSObject一個子類:

class Animal: NSObject { 

    class func getAnimalOfType<T: Animal>(animals: [Animal], animalType: T.Type) -> Animal? { 
     for animal in animals { 
      if animal.isKindOfClass(animalType) { 
       return animal 
      } 
     } 
     return nil 
    } 

} 

class Zebra: Animal { } 
class Whale: Animal { } 
var animals = [Zebra(), Whale()] 
Animal.getAnimalOfType(animals, animalType: Zebra.self) 

如果Animal不是NSObject一個亞型,你總是可以做到這 - - 但似乎有點哈克對我說:

if "\(animal.dynamicType)" == "\(animalType)" { 
     return animal 
} 
1

可以使用的身份運營商===檢查數組元素的類型等於泛型類型:

if animal.dynamicType === animalType { 
    return animal 
} 
+0

不,你不能。編譯器會拋出一個錯誤:「二元運算符'==='不能應用於類型'Animal.Type'和'T'的操作數」 – kellanburket 2015-03-02 19:47:11

+1

@blacksquare你必須做錯某事 - 它在故事板中完美工作,並且此外,我沒有在該代碼片段中使用'T' ... – Antonio 2015-03-02 19:55:02

+0

我剛剛在swift 1.1中測試了您的代碼,它的工作原理。我正在使用swift 1.2進行測試,並且拋出一個錯誤 - 所以要小心未來。我正在使用我用來比較返回的字符串值的語法,這是一個有效的比較,因爲它們都是字符串。在任何事件中,問題的最佳答案是簡單地檢查'是T'。 – kellanburket 2015-03-02 20:03:25

0
struct Test<T: Hashable> { 

    static func test(t: Any) { 
     println(t is T) 
    } 
} 

Test<Int>.test(3) 

在這個例子中,我傳遞的類型(智力在我的情況,animalType在你)的結構和變量(我INT(3),你的動物)的靜態功能測試的參數。我用T:Hashable,你會想用T:Animal來測試。