2015-07-01 3 views
1

У меня есть ряд классов Java, которые мне нужно преобразовать в код Swift. Один из классов имеет расширенное перечисление:Расширенные Java-перечисления в Swift

public enum Student { 

    STUDENT_ONE("Steve", "Jobs") 
    STUDENT_TWO("Tim", "Cook") 

    private String _firstName; 
    private String _lastName; 
} 

Как я могу повторить то же самое поведение в Swift?

ответ

2

Я пытался сделать то же самое с конвертированием Java код Swift, и в конечном итоге делает что-то вроде этого:

public enum Student { 

    case STUDENT_ONE 
    case STUDENT_TWO 

    var firstName: String { 
     get { 
      switch self { 
      case .STUDENT_ONE: 
       return "Steve" 
      case .STUDENT_TWO: 
       return "Tim" 
      } 
     } 
    } 

    var lastName: String { 
     get { 
      switch self { 
      case .STUDENT_ONE: 
       return "Jobs" 
      case .STUDENT_TWO: 
       return "Cook" 
      } 
     } 
    } 
} 

Теперь, это действительно долго и грязно, и я не совсем уверен в том, это правильный способ сделать это, но я не мог найти ничего другого, что сработало. Мне было бы интересно узнать, есть ли другой способ сделать это.

+0

Я добавил способ, которым я сейчас обрабатываю его. Не знаю, какое из этих двух решений мне больше нравится .... – YogevSitton

+0

Это слишком сложно и слишком много. – Laurent

1

Это то, что я в конечном итоге делает - не уверен, что это вообще:

struct Students { 

    enum Students { 
     case STUDENT_ONE(String, String) 
     case STUDENT_TWO(String, String) 
    } 

    let STUDENT_ONE = Students.STUDENT_ONE("Steve", "Jobs") 
    let STUDENT_TWO = Students.STUDENT_TWO("Steve", "Two") 
} 
+0

Это, безусловно, лучше (или менее подробный, я должен сказать), чем мой ответ. – aksh1t

+0

Все еще не уверены в этом решении. Я надеюсь увидеть некоторые другие предложения, прежде чем принять это в качестве ответа. – YogevSitton

+0

Действительно. Тоже самое. – aksh1t

3

Поразмыслив, я согласен с godmoney решением этого aksh1t является лучше, что мое решение с использованием строк.

Во всяком случае, здесь является более кратким вариантом решения aksh1t, используя только один вычисленное свойство возвращает кортеж: (протестирован в Swift 2.0)

enum Student { 
    case STUDENT_ONE, STUDENT_TWO 

    typealias Details = (firstName: String, lastName: String) 
    var details : Details { 
     switch(self) { 
     case STUDENT_ONE : return ("Steve", "Jobs") 
     case STUDENT_TWO : return ("Tim", "Cook") 
     } 
    } 
} 

// Usage: 
func test(sd: Student.Details) { 
    print(sd.firstName) 
    print(sd.lastName) 
} 
test(Student.STUDENT_ONE.details) 
1

Перечисление не обязательно лучший выбор, чтобы представить этот тип данные. Я выбираю struct с, и это работает хорошо, используя правильные аксессоры:

public struct Student { 
    public let firstName : String 
    public let lastName : String 

    public static let STUDENT_ONE = Student(firstName: "Steve", lastName: "Jobs") 
    public static let STUDENT_TWO = Student(firstName: "Tim", lastName: "Cook") 
} 
+0

Вы даже можете опустить метод init и использовать конструктор по умолчанию. –

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