2014-10-18 13 views
12

Tôi đang sử dụng sân chơi Xcode 6 để thử enums trong Swift:enum của không được công nhận

enum Rank: String 
{ 
    case One = "One", Two="Two" 

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

Tôi muốn ghi đè init để enum có thể được khởi tạo sử dụng nó rawValue như là đối số. Nhưng tôi nhận được một lỗi:

enter image description here

Nhưng theo Apple's Swift guide mã của tôi nên chính xác.

Trả lời

10

Martin trả lời là hoàn toàn đúng.

Dưới đây là một chế độ xem khác để trả lời trực tiếp câu hỏi của bạn hơn.

Trong Xcode 6.0, enum không có thuộc tính rawValue. rawValue đã được thêm vào Xcode 6.1 nhưng lưu ý rằng đây là thuộc tính được tính chỉ đọc, vì vậy bạn không thể gán cho nó trong Xcode 6.1.

Trong Xcode 6.1, không cần thiết phải triển khai bộ khởi tạo mất rawValue vì ngôn ngữ đó đã được cung cấp tự nhiên. Nếu bạn đang cố gắng bắt chước rằng hành vi trong Xcode 6.0, sau đó bạn có thể thử một cái gì đó như:

enum Rank: String 
{ 
    case One = "One", Two="Two" 

    init(rawValue : String) 
    { 
     self = Rank.fromRaw(rawValue) 
    } 
} 

nhưng vấn đề với điều này là fromRaw trả về một giá trị enum không bắt buộc vì chuỗi rawValue có thể tương ứng với bất kỳ giá trị enum.

Vì vậy, bạn sẽ làm gì vào thời điểm này? Bạn có thể thêm một ! để buộc unwrap giá trị:

self = Rank.fromRaw(rawValue)! 

nhưng điều này sẽ sụp đổ nếu bạn đã cố gắng để tạo ra một enum với một giá trị nguyên không hợp lệ.

Bạn có thể đối xử với một trong các giá trị enum như một mặc định và sử dụng nil coalescing hành?? để unwrap an toàn nó:

self = Rank.fromRaw(rawValue) ?? One 

đó sẽ tránh một vụ tai nạn, nhưng có lẽ sẽ dẫn đến bất ngờ hành vi trên một phần của chương trình của bạn.

Những gì bạn không thể làm trong Xcode 6.0 là có init trả lại giá trị tùy chọn. Khả năng này đã được thêm vào Xcode 6.1 và chính xác là khả năng mới này cho phép họ thay đổi fromRaw() từ một hàm trong Xcode 6.0 thành bộ khởi tạo tùy chọn trong Xcode 6.1.

14

Phương thức chuyển đổi giữa enums và giá trị thô của chúng thay đổi giữa Xcode 6.0 và Xcode 6.1. Phương pháp fromRaw()toRaw() đã được thay thế bởi một (failable) initializer và một tài sản rawValue:

Xcode 6.0:

// raw value to enum: 
if let rank = Rank.fromRaw("One") { } 

// enum to raw value: 
let str = rank.toRaw() 

Xcode 6.1:

// raw value to enum: 
if let rank = Rank(rawValue: "One") { } 

// enum to raw value: 
let str = rank.rawValue 
+0

Bạn có biết các trình khởi tạo bình thường/không khả dụng không được hỗ trợ hay chỉ bị hỏng? http://stackoverflow.com/questions/28653484/swift-enums-normal-non-failable-initializers-not-supported-or-just-broken? Cảm ơn -c –

+1

Đã kiểm tra trên Xcode 7.0 (beta 3) và 'Rank (rawValue:" One ")' chính xác khởi tạo thành viên enum ... – Zorayr

Các vấn đề liên quan