gpt4 book ai didi

swift - 如何检查 Swift 中的枚举类型?

转载 作者:搜寻专家 更新时间:2023-10-31 08:04:56 25 4
gpt4 key购买 nike

我正在编写一个可以序列化枚举和其他 Swift 类型(字符串、对象等)的序列化程序。所以我需要检查传递到我的序列化器中的 Any 参数是否是枚举或其他东西。似乎在 Swift 中唯一的方法就是使用反射。下面的代码是否合理,或者是否有更好的方法来检查枚举类型?

enum Things {
case Thing1
case Thing2
}

let something:Any = Things.Thing1
let mirror = Mirror(reflecting: something)
if (mirror.displayStyle == .Enum) {
print("Reflected type is Enum") // works
}

最佳答案

Mirror.displayStyle是一个可选的枚举,最好在同一语句中使用条件展开和类型检查。

您可以扩展 Mirror.displayStyle通过 .equals使它易于访问的方法,以防您想经常进行此枚举检查。

extension Mirror.DisplayStyle {
func equals(displayCase: Mirror.DisplayStyle) -> Bool {
return self == displayCase
}
}

enum Things {
case Thing1
case Thing2
}

let something:Any = Things.Thing1
let mirror = Mirror(reflecting: something)

/* short form: using nil coalescing and ternary conditional operator */
mirror.displayStyle?.equals(.Enum) ?? false ? print("Reflected type is an Enum") : ()

/* another option: or using if-let */
if let _ = mirror.displayStyle?.equals(.Enum) {
print("Reflected type is an Enum")
}

请注意,您无需显式创建和存储 Mirror此检查的实例,但可以在一个表达式中完成所有操作,例如 something类型 Any :

Mirror(reflecting: something).displayStyle?.equals(.Enum) ?? false ? print("Reflected type is an Enum") : ()

最后,如果您只是对基于 DisplayStyle 做一些简单的操作感兴趣案例不同Any例如,您可以创建一个函数来切换此枚举的不同情况。下面,“简单操作”只是打印大小写。

//... 

func foo(mirror: Mirror) {
if let dispStyle = mirror.displayStyle {
switch(dispStyle) {
case .Class: print("Reflected type is a Class")
case .Collection: print("Reflected type is a Collection")
case .Dictionary: print("Reflected type is a Dictionary")
case .Enum: print("Reflected type is an Enum")
case .Optional: print("Reflected type is an Optional")
case .Set: print("Reflected type is a Set")
case .Struct: print("Reflected type is a Struct")
case .Tuple: print("Reflected type is a Tuple")
}
}
}

let something: Any = Things.Thing1
foo(Mirror(reflecting: something))

另见 Language Reference for Mirror.DisplayStyle .

关于swift - 如何检查 Swift 中的枚举类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34727186/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com