2016-12-20 1 views
1

У меня 3 Animal Массивы:Определение, какой массив строка пришел из

let mammals = ["Dog", "Cat", "Bear"] 
let fish = ["Clownfish", "Seahorse", "Scorpion Fish"] 
let reptiles = ["Chameleon", "Snake", "Lizard"] 

Кнопка генерирует животное случайным образом, а затем добавляет его в массив allAnimals. Я хотел бы иметь возможность определять массив WHICH, из которого произошла строка (животное).

Я пытался работать с

allAnimals.contains() 

однако, явно принимает вар в качестве аргумента. Я могу сделать allAnimals.contains («Seahorse») просто отлично. Но мне нужно проверить все массивы.

Я также попытался выполнить итерацию по массиву.

for i in allAnimals { 
    if i.contains(mammals){ print("Came from the Mammal array") } 
    else if i.contains(fish){ print("Came from the Fish array") } 
    else if i.contains(reptiles){ print("Came from the Reptiles array") } 
} 

что бросил ошибку:

Cannot convert value of type '[String]' to expected argument type 'String' 

Как я могу определить, какой массив случайная строка пришел?

+1

Вы можете создать структуру для каждого типа, а затем проверить, какой тип она есть. Вы также можете создать перечисление для каждого типа, который принимает связанное значение. – JustinM

+0

Большое спасибо за все предложения здесь, ребята. Решение @vadian работало отлично для меня, но мне очень полезно увидеть другие способы, которыми это могло быть достигнуто. – Joe

ответ

1

Другой путь круглый

for anAnimal in allAnimals { // with a bit more descriptive index variable 
    if mammals.contains(anAnimal){ print("Came from the Mammal array") } 
    else if fish.contains(anAnimal){ print("Came from the Fish array") } 
    else if reptiles.contains(anAnimal){ print("Came from the Reptiles array") } 
} 
+0

Это сделало трюк !! СПАСИБО! Я буду принимать это как ответ через 5 минут. – Joe

0

Вы должны проверить, если каждый массив содержит случайно выбранных животных.

let mammals = ["Dog", "Cat", "Bear"] 
let fish = ["Clownfish", "Seahorse", "Scorpion Fish"] 
let reptiles = ["Chameleon", "Snake", "Lizard"] 

let chosenAnimal = "Cat" 

if mammals.contains(chosenAnimal) { 
    print("mammal") 
} else if fish.contains(chosenAnimal) { 
    print("fish") 
} else if reptiles.contains(chosenAnimal) { 
    print("reptile") 
} else { 
    print("animal not in any arrays") 
} 
3

Вы можете определить перечисление с различными типами животных, и построить массивы этого типа перечисления животных, где соответствующее значение каждого случая в перечислении (String) дает подробную информацию о животном.

E.g. Использование

enum Animal: CustomStringConvertible { 
    case mammal(String) 
    case fish(String) 
    case reptile(String) 

    var description: String { 
     switch self { 
     case .mammal: return "Mammal" 
     case .fish: return "Fish" 
     case .reptile: return "Reptile" 
     } 
    } 

    var species: String { 
     switch self { 
     case .mammal(let s), .fish(let s), .reptile(let s): return s 
     } 
    } 
} 

Пример:

let mammals = ["Dog", "Cat", "Bear"].map(Animal.mammal) 
let fish = ["Clownfish", "Seahorse", "Scorpion Fish"].map(Animal.fish) 
let reptiles = ["Chameleon", "Snake", "Lizard"].map(Animal.reptile) 

let allAnimals = [reptiles[2], mammals[1]] 

for animal in allAnimals { 
    print("\(animal.species) is a \(animal)") 
} /* Lizard is a Reptile 
    Cat is a Mammal  */ 
0

подход чистого протокола (Swift 3)

Так в основном, как другие предложили ... Используя массив, чтобы определить, к какой группе он принадлежит не действительно правильный дизайн. Однако, если его что-то очень простое, и вы точно знаете, что его не нужно расширять, ваш подход может быть на самом деле в порядке.

protocol Animal: CustomStringConvertible { 
    var description: String { get } 
} 
protocol Mammal: Animal {} 
protocol Fish: Animal {} 
protocol Reptile: Animal {} 

class Dog: Mammal { var description: String = "Dog" } 
class Cat: Mammal { var description: String = "Cat" } 
class Bear: Mammal { var description: String = "Bear" } 

class Clownfish: Fish { var description: String = "Clownfish" } 
class Seahorse: Fish { var description: String = "Seahorse" } 
class ScorpionFish: Fish { var description: String = "Scorpion Fish" } 

class Chameleon: Reptile { var description: String = "Chameleon" } 
class Snake: Reptile { var description: String = "Snake" } 
class Lizard: Reptile { var description: String = "Lizard" } 

let everyAnimal:[Animal] = [Dog(), Cat(), Bear(), Clownfish(), Seahorse(), ScorpionFish(), Chameleon(), Snake(), Lizard()] 
let fish = everyAnimal.filter({$0 is Fish}) 
print(fish) 
// Clownfish, Seahorse, Scorpion Fish 
let mammals = everyAnimal.filter({$0 is Mammal}) 
print(mammals) 
// Dog, Cat, Bear 
let reptiles = everyAnimal.filter({$0 is Reptile}) 
print(reptiles) 
// Chameleon, Snake, Lizard 
Смежные вопросы