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.
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 –
Đã 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