调用 `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) 我如何检查这个特定的 selfenum 类型因此需要特殊处理?

谢谢!

这是一个 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))
    }