加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

swift – 如何检测该参数是两个任意类型的元组?

发布时间:2020-12-14 05:48:52 所属栏目:百科 来源:网络整理
导读:我实际上做的更复杂,但它归结为能够实现函数来检测某些东西是元组,而不管它的元素类型是什么. 这是我的approch不起作用(见最后一行的评论): func isTuple(b: Any) - Bool { return b is (Any,Any)}let myString = "aa"let myDouble = 1.2isTuple((myString,
我实际上做的更复杂,但它归结为能够实现函数来检测某些东西是元组,而不管它的元素类型是什么.

这是我的approch不起作用(见最后一行的评论):

func isTuple(b: Any) -> Bool {
    return b is (Any,Any)
}

let myString = "aa"
let myDouble = 1.2
isTuple((myString,myDouble)) //returns false

为什么不起作用? Shoul不作为元组中的“通配符”也是如此?它是一个已知的Swift错误(如果不是我应该考虑它并报告)?有没有其他方法如何使isTupple方法工作?

编辑

@NateCook’s answer完全回答原始问题,但这对我做我想做的事情没有帮助.就是这个:

我不仅需要确定某个东西是一个问题,还需要在不知道这些值的确切类型的情况下将其分解为2个值.

这是代码:

func processIfTuple(b: Any) {
    if reflect(b).disposition == MirrorDisposition.Tuple {
        let (first,second) = b as (Any,Any) //error when casting
        process(first)
        process(second)
    }
}

func process(value: Any) {
    ...
}

processIfTuple(("aa",1.2))

这不是因为测试b是(Any,Any)不起作用的类似原因.这次尝试施法时出错.这可以解决吗?如果不是应该被视为语言错误或缺少功能并报告?它肯定会导致很多代码重复,因为我需要为元组测试所有可能的类型对.

您可以使用Swift的宝贝内省方法来实现:
func isTuple(b: Any) -> Bool {
    return reflect(b).disposition == MirrorDisposition.Tuple
}

请注意,反射很大程度上没有记录,可能只是作为操场/调试器的支持,但据我所知,这是唯一的方法.

要实现这一点,你需要深入了解reflect()给你的东西,这是一个符合MirrorType的结构,我称之为反射,因为缺少一个更好的术语.您可以下标元组的反射以获取元组成员的反射,然后将值作为Any返回.此时,您可以使用可选绑定来安全地重新发现基础类型:

func process(value: Any) {
    println("Any (value)")
}

func process(value: String) {
    println("String (value)")
}

func processTuple(b: Any) -> Bool {
    let isTuple = reflect(b).disposition == MirrorDisposition.Tuple

    let r = reflect(b)
    for i in 0..<r.count {
        println(r[i].0)         // string holding tuple part name: ".0",".1",etc
        println(r[i].1.value)   // the value of that tuple part: "aa",1.2

        process(r[i].1.value)   // calls process(Any)
        if let val = r[i].1.value as? String {
            process(val)        // calls process(String)
        }
    }

    return isTuple
}

let myString = "aa"
let myDouble = 1.2
processTuple((myString,myDouble)) //returns false

输出:

.0
aa
Any aa
String aa
.1
1.2
Any 1.2

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读