簡體   English   中英

您如何在快速枚舉的情況下為某些情況設置默認值,而為其他情況設置動態值?

[英]How do you cases in swift enumeration that has default values for some cases and dynamic values for others?

讓我們以FileTypes枚舉為例

  enum FileType {
    case Header
    case Image
    case Swift
    init? (rawValue : String ){
        switch rawValue {
        case "h":
            self = .Header
        case "png" , "jpeg", "jpg":
            self = .Image
        case "swift":
            self = .Swift
        default:
            return nil
        }
    }
}

上述列舉適用於該語句

let fileType = FileType(rawValue:"jpeg")
let fileType2 = FileType(rawValue:"png")

fileType和fileType2都將解析為.Image枚舉大小寫。 但是,當我訪問它們的rawValue時,它將包含“圖像”。

我將如何獲得首先解決到.Image的實際擴展名? 即訪問

fileType.rawValue應該導致jpeg

fileType2.rawValue應該產生png

您需要明確說明這些值是什么。

enum FileType: String {
    case Header = "h"
    case Image = "jpg"
    case Swift = "swift"
}

這樣,您就可以確定枚舉是字符串類型。

編輯:我忘記了.Image情況。 我認為您不能擁有具有多個不同值的案例。 如果獲得FileType(rawValue:“ jpg”),則將獲得.Image,這是正確的。 但是,如果您具有.Image,Swift如何確定它是“ jpg”還是“ png”呢? 那是錯誤的方法。

相反,您可以擴展String,如下所示:

extension String {
    var extensionIsImage: Bool {
        return self == "jpg" || self == "png"
    }
}

這樣,您就不會失去擴展的價值。

編輯2:請注意, extension String表示Swift擴展名,而不是文件擴展名。

這應該使您更好地了解如何處理這種情況:

enum FileType {
    case Header
    case Imge(String)
    case Swift
    init? (fileExt : String ){
        switch fileExt {
        case "h":
            self = .Header
        case "png" , "jpeg", "jpg":
            self = .Imge(fileExt)
        case "swift":
            self = .Swift
        default:
            return nil
        }
    }
}

var fileType = FileType(fileExt:"jpeg")!
var fileType2 = FileType(fileExt:"png")!

switch fileType2 {
case let .Imge(exten):
    print("\(exten)", terminator:"")
default:
    print("Error")
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM