如何在swift枚举中为某些情况设置默认值,为其他情况设置动态值?

时间:2016-07-08 21:27:42

标签: swift enums swift3

让我们举一个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"。

我如何实现获得解决的实际扩展.Image首先?即访问

fileType.rawValue应该导致 jpeg

fileType2.rawValue应该导致 png

2 个答案:

答案 0 :(得分:0)

您需要明确说明这些值是什么。

check(matches(isDisplayed()))

这样你就告诉enum是一个字符串类型。

编辑: 我忘记了.Image案例。我认为你不能有一个具有几个不同值的案例。如果你得到一个FileType(rawValue:“jpg”)那么你将获得.Image,这是正确的。但是,如果你有.Image,Swift如何确定它是“jpg”还是“png”?这是错误的做法。

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

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

这样你就不会失去扩展名的价值。

编辑2:请注意extension String { var extensionIsImage: Bool { return self == "jpg" || self == "png" } } 表示Swift扩展名,而不是文件扩展名。

答案 1 :(得分:0)

这可以让您更好地了解如何处理这种情况:

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")
}