调用 `type(of: xxx)` 时 Swift 中的 type `(val: string)` 到底是什么
What exactly is type `(val: string)` in Swift when calling `type(of: xxx)`
我是运行特定自定义类型的跟随函数:
let mirror = Mirror(reflecting: self)
print("self \(self)");
for (propName, propValue) in mirror.children {
print("propname \(propName) ... \(propValue)", type(of: propValue))
}
正在打印出来
self UserAuthInput.userEmail(val: bob@gmail.com)
propname Optional("userEmail") ... (val: "bob@gmail.com") (val: String)
作为一个 Swift 新手,我很难理解 (val: string)
类型到底是什么意思。我知道它来自这样的定义:
public enum UserAuthInput {
case userEmail(val: String)
case userPhone(val: String)
}
但是我的问题是,
1) 如何从 (val: string)
类型对象 propValue
中解析 bob@gmail.com
?
2) 我如何检查这个特定的 self
是 enum
类型因此需要特殊处理?
谢谢!
这是一个 one-element 元组。这通过使用另一个镜像来反映 child 的值得到证实:
let mirror = Mirror(reflecting: UserAuthInput.userEmail(val: "xxx@example.com"))
for (propName, propValue) in mirror.children {
print("propname \(propName!) ... \(propValue)", type(of: propValue))
let subMirror = Mirror(reflecting: propValue)
print(subMirror.displayStyle!) // tuple
// this is one way you can get its value
print(subMirror.children.first!.value) // xxx@example.com
}
通常你不能创建 one-element 元组,所以我对此也感到很惊讶。由于不能在代码中使用类型(val: String)
,因此无法通过简单的强制转换获得关联值的值。我在上面展示的一种方法是使用另一个镜像。
这与2个或更多关联值的情况一致,这也使得propValue
是一个元组类型。
public enum UserAuthInput {
case userEmail(val: String, val2: String)
case userPhone(val: String)
}
let mirror = Mirror(reflecting: UserAuthInput.userEmail(val: "xxx@example.com", val2: "hello"))
for (_, propValue) in mirror.children {
print(type(of: propValue) == (val: String, val2: String).self) // true
}
要检查镜像是否反映枚举,检查displayStyle
:
if mirror.displayStyle == .enum {
// enum!
}
你没有描述你的类型(Mirror),所以有一些猜测。
如果问题是如何提取字符串:
for (propName, propValue) in mirror.children {
if case .userEmail(let mail) = XXXX { // The value to match. Is it mirror here ?
print(mail)
}
print("propname \(propName) ... \(propValue)", type(of: propValue))
}
我是运行特定自定义类型的跟随函数:
let mirror = Mirror(reflecting: self)
print("self \(self)");
for (propName, propValue) in mirror.children {
print("propname \(propName) ... \(propValue)", type(of: propValue))
}
正在打印出来
self UserAuthInput.userEmail(val: bob@gmail.com)
propname Optional("userEmail") ... (val: "bob@gmail.com") (val: String)
作为一个 Swift 新手,我很难理解 (val: string)
类型到底是什么意思。我知道它来自这样的定义:
public enum UserAuthInput {
case userEmail(val: String)
case userPhone(val: String)
}
但是我的问题是,
1) 如何从 (val: string)
类型对象 propValue
中解析 bob@gmail.com
?
2) 我如何检查这个特定的 self
是 enum
类型因此需要特殊处理?
谢谢!
这是一个 one-element 元组。这通过使用另一个镜像来反映 child 的值得到证实:
let mirror = Mirror(reflecting: UserAuthInput.userEmail(val: "xxx@example.com"))
for (propName, propValue) in mirror.children {
print("propname \(propName!) ... \(propValue)", type(of: propValue))
let subMirror = Mirror(reflecting: propValue)
print(subMirror.displayStyle!) // tuple
// this is one way you can get its value
print(subMirror.children.first!.value) // xxx@example.com
}
通常你不能创建 one-element 元组,所以我对此也感到很惊讶。由于不能在代码中使用类型(val: String)
,因此无法通过简单的强制转换获得关联值的值。我在上面展示的一种方法是使用另一个镜像。
这与2个或更多关联值的情况一致,这也使得propValue
是一个元组类型。
public enum UserAuthInput {
case userEmail(val: String, val2: String)
case userPhone(val: String)
}
let mirror = Mirror(reflecting: UserAuthInput.userEmail(val: "xxx@example.com", val2: "hello"))
for (_, propValue) in mirror.children {
print(type(of: propValue) == (val: String, val2: String).self) // true
}
要检查镜像是否反映枚举,检查displayStyle
:
if mirror.displayStyle == .enum {
// enum!
}
你没有描述你的类型(Mirror),所以有一些猜测。
如果问题是如何提取字符串:
for (propName, propValue) in mirror.children {
if case .userEmail(let mail) = XXXX { // The value to match. Is it mirror here ?
print(mail)
}
print("propname \(propName) ... \(propValue)", type(of: propValue))
}