2017-02-11 25 views
1

Я новичок и до сих пор учился. Для практики я хотел попробовать идею и посмотреть, смогу ли я смоделировать что-то самостоятельно. Например, если у меня есть 2 набора данных в перечисленияхSwift 3.0 - Функции вызова, основанные на каждом случае из двух разных перечислений

protocol Pet { 
    var type: PetType { get } 
} 

protocol PetType {} 

enum Cat: PetType { 
    case indoor 
    case outdoor 
} 

enum Dog: PetType { 
    case small 
    case medium 
    case large 
} 

struct MyPet: Pet { 
    let type: PetType 
    let age: Int 
} 

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

let garfield = myPet(type: Cat.indoor, age: 3) 
myPet.inHumanYears 

Он должен выполнить правильную функцию.

Я пробовал несколько вещей, но пока мои знания пока ограничены. Может ли кто-нибудь руководить/преподавать, как я могу это решить?

спасибо.

ответ

1

enum - мощный тип в быстром. Что действительно здорово, так это то, что он может иметь функции и свойства, которые зависят от того, что это self (case). Добавив некоторые свойства в перечисление, вы можете делать то, что собираетесь.

Ваш код будет выглядеть примерно так:

protocol Pet { 
    var type: PetType { get } 
} 

protocol PetType { 
    func inHumanYears(age: Int) -> Int 
} 

enum Cat: PetType { 
    case indoor 
    case outdoor 

    func inHumanYears(age: Int) -> Int { 
    switch self { 
    case .indoor: 
     //return you calculations for indoor 
    case .outdoor: 
     //return you calculations for outdoor 
    } 
    } 
} 

enum Dog: PetType { 
    case small 
    case medium 
    case large 

    func inHumanYears(age: Int) -> Int { 
    switch self { 
    case .small: 
     //return you calculations for small 
    case .large: 
     //return you calculations for large 
    case .medium: 
     //return you calculations for medium 
    } 
    } 
} 

struct MyPet: Pet { 
    let type: PetType 
    let age: Int 

    var inHumanYears: Int { 
    return type.inHumanYears(age: age) 
    } 
} 

PetType The проверяет, какой случай перечисления она сама и вычисляет соответственно. Тогда вы можете сделать:

let garfield = MyPet(type: Cat.indoor, age: 3) 
print(garfield.inHumanYears) 

Надеюсь, это поможет!

+0

Это действительно помогает, спасибо. Могу ли я использовать if else в каждом случае, или я могу только вернуть значение. Поскольку в зависимости от диапазона возраста расчеты различаются для каждого случая. –

+0

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

+0

Это хорошо работает :) Просто из любопытства, это лучший способ сделать это? используя if else для вычислений, или есть больше способов сделать это? У меня есть чему поучиться. –

0

Существует несколько способов. Если человеческие годы будут уникальными (т. Е. У кошки на открытом воздухе никогда не будет таких же человеческих лет, как крытый кот), вы можете расширить Int и просто использовать rawValue. В противном случае, вы правы с approaach, и вы могли бы сделать это:

Уникальных человеческих лет

import UIKit 

protocol Pet { 
    var type: PetType { get } 
} 

protocol PetType { 
    var humanYears: Int { get} 
} 

enum Cat: Int, PetType { 
    case indoor = 1 
    case outdoor = 10 

    var humanYears: Int { 
     return self.rawValue 
    } 
} 

enum Dog: Int, PetType { 
    case small = 40 
    case medium = 1 
    case large = 4 

    var humanYears: Int { 
     return self.rawValue 
    } 

} 

struct MyPet: Pet { 
    let type: PetType 
    let age: Int 
} 

let garfield = MyPet(type: Cat.indoor, age: 3) 
garfield.type.humanYears 

дубликат человек годами

import UIKit 

protocol Pet { 
    var type: PetType { get } 
} 

protocol PetType { 
    var humanYears: Int { get} 
} 

enum Cat: PetType { 
    case indoor 
    case outdoor 

    var humanYears: Int { 
     switch self { 
     case .indoor: return 4 
     case .outdoor: return 5 
     } 
    } 
} 

enum Dog: PetType { 
    case small 
    case medium 
    case large 

    var humanYears: Int { 
     switch self { 
     case .small: 
      if (yearIs1960) { 
       return 10 
      } 
      else { 
       return 8 
      } 
     case .medium: return 5 
     case .large: return 5 
     } 
    } 
} 

struct MyPet: Pet { 
    let type: PetType 
    let age: Int 
} 

let garfield = MyPet(type: Cat.indoor, age: 3) 
garfield.type.humanYears 

Вот действительно good article Бенедикта Terhechte, который идет в глубину с примерами о возможностях с перечислениями

+0

Спасибо! Я думаю, что обе идеи мне очень помогают, я хочу, чтобы в каждом случае было какое-то утверждение if else, потому что возраст может быть чем угодно. –

+0

Я обновил сообщение для перечисления собаки, чтобы показать, как вы это сделаете. –

 Смежные вопросы

  • Нет связанных вопросов^_^