2015-07-01 91 views
1

我有許多Java類需要轉換爲Swift代碼。 類中的一個具有先進的枚舉:Swift中的高級Java枚舉

public enum Student { 

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

    private String _firstName; 
    private String _lastName; 
} 

我怎麼能複製斯威夫特同樣的行爲?

回答

2

我試圖做同樣的事情與Java代碼轉換爲雨燕,並最終做這樣的事情:

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的溶液的更簡潔的變型中,僅使用一個計算屬性返回的元組:(在夫特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 S和這個效果很好,使用正確的存取:

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方法並使用默認構造函數。 –