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

2023-12-01

我实际上正在做的事情更复杂,但归根结底是能够实现函数来检测某个东西是一个元组,无论其元素的类型是什么。

这是我的方法,不起作用(请参阅最后一行的评论):

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

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

为什么不起作用?不应该Any也充当元组中的“通配符”?这是一个已知的 Swift 错误吗(如果不是,我应该将其视为一个错误并报告)吗?还有其他方法可以制作吗isTupple方法工作?


EDIT

@NateCook 的回答完全回答了原来的问题,但它并不能帮助我做我想做的事情。就是这个:

我不仅需要确定某个东西是一个元组,而且还需要将其分解为两个值,而不知道这些值的确切类型。

这是代码:

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 is (Any, Any)不起作用。这次尝试投射时出现错误。这个问题能解决吗?如果不是,是否应该将其视为语言错误或缺少功能并报告?它肯定会导致大量代码重复,因为我需要测试元组的所有可能的类型对。


您可以使用 Swift 的婴儿内省方法来实现这一点:

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

注意reflect很大程度上没有记录,可能只是作为对游乐场/调试器的支持,但据我所知,这是唯一的方法。


为了实现这一目标,您需要深入研究什么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

Output:

.0
aa
Any aa
String aa
.1
1.2
Any 1.2
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何检测该参数是两个任意类型的元组? 的相关文章

随机推荐

  • mysql 选择 a 和 b 之间的时间戳返回全部或 0 时间戳

    试过这个 select from table where timestamp field between 1330560000 and 1336170420 and this select from table where timestam
  • Alfresco Maven SDK - 如果模块版本字符串以“-SNAPSHOT”结尾则失败

    因此 我创建了一个 amp 项目 包括存储库和共享 每次我尝试构建或运行该项目时都会失败 java lang NoClassDefFoundError de schlichtherle truezip fs FsSyncExceptionB
  • 星号点击通话

    也许你们中的一些人可能知道如何实现这一目标 我想要这样的东西 单击链接 按钮 我的电话响了 我接起 Asterisk 帮我拨打号码 收件人电话铃声响起 我正在使用星号1 2 我尝试过dial out 但我只能向一侧打电话 提前致谢 您可以使
  • 如何序列化多个模型对象?

    我正在使用 Django Rest Framework 创建一个 API 它需要来自多个模型的数据 我的要求得到了很多答案 但它不起作用 我的模型如下 class Task models Model title models CharFie
  • 使用手机信号塔信息的 Google 地理定位 - Curl 400 错误请求 PHP

    我正在尝试使用以下方法从手机信号塔信息中获取纬度和经度谷歌的地理定位 API 它需要一个有效的 JSON 其中包含 MCC MNC cellId lac 等信息 我的 PHP post 请求如下所示
  • View的setTag方法有什么用?

    我正在实施一个ListView使用自定义适配器 为了提高性能 我将返回新充气的View if convertView为 null 否则返回回收的View 现在在这个过程中我使用了视图持有者模式并使用了setTag 的方法View 最初我以为
  • 即使不支持 IPv6,如何在 Google Cloud 上运行 iOS 应用程序

    苹果新的应用商店政策已于 6 月 1 日生效 提交到 App Store 的所有应用程序都必须支持纯 IPv6 网络 https developer apple com news id 05042016a 如何在仅支持 IPv4 的 Goo
  • 如何从批处理脚本中获取注册表项的值?

    我需要使用 REG QUERY 命令来查看键的值 并使用以下命令将结果设置到变量中 FOR F tokens 2 delims A IN REG QUERY KeyName v ValueName DO SET Variable B 但如果
  • mgcv:如何在predict.gam中使用“排除”参数?

    我有一个结构如下的模型 我想提取预测值 同时忽略随机效应 如指定 predict gam and here 我正在使用exclude争论 但我收到错误 我的错误在哪里 dt lt data frame n1 runif 500 min 0
  • createReadStream 错误:“确定,打开”

    我有以下代码片段 该函数位于针对不同文件多次调用的函数中 var readStream fs createReadStream file readStream on error function err console log err 通常
  • 使用 spring 覆盖属性文件

    我在 Spring 3 1 XML 之一中定义了以下属性文件
  • 如何使用应用程序脚本在 Google 电子表格的单元格内添加 UI?

    我想向 Google 文档电子表格中的特定单元格添加按钮 这应用程序脚本 UI 文档讨论如何添加新面板 但尚不清楚该面板中的 UI 如何附加到特定的行或单元格 是否可以将 UI 添加到特定单元格 或者我们仅限于添加新面板 应用程序 UI 仅
  • TypeError:无效的前景 RGBA 参数

    每次我尝试运行 Pygame 程序时 都会收到此错误 TypeError 无效的前景 RGBA 参数 这是我的代码 你知道为什么吗 text font render b Score dude score 1 0 0 0 as per the
  • ostream:在 cout 或文件上输出的类

    我需要编写一个程序 将其输出到std cout或某个文件 我正在读书这个帖子看看该怎么做 但是我想将 ostream 的管理与main 所以我想写一个类 但我对设计有点困惑 我想到了两个解决方案 公开 子类ostream 这样我就可以拥有o
  • 双向无限 UIScrollView

    我想创建一个无限滚动视图 就像老虎机 但没有分页 当用户向下滚动时 很容易我只需增加 contentSize 和 scrollView 无限滚动 void scrollViewDidScroll UIScrollView theScroll
  • Android中如何检测上传/下载传输速率?

    我正在开发一个上传大量数据的应用程序 我想确定上传的传输速率 以在通知中显示 One post建议使用WifiInfo这不适用于移动数据 Another post建议获取网络类型来估计速度 我对这些帖子的答案不满意 所以我再次询问 我见过显
  • Sendgrid php发送给多个收件人

    我有简单的 sendgrid php 脚本来发送电子邮件 这里唯一的问题是我需要添加更多收件人 因此此代码仅适用于一个收件人 我正在查看官方文档 但无法找到任何有用的信息 有谁知道知道我需要如何以及在此处进行更改以添加更多收件人 电子邮件
  • 使用 SQLite WHERE 子句和 IN 运算符时保持顺序

    考虑以下tbl CREATE TABLE tbl ID INTEGER ticker TEXT desc TEXT INSERT INTO tbl ID ticker desc VALUES 1 GDBR30 30YR 2 GDBR10 1
  • C++ 如何使函数指针指向类方法[重复]

    这个问题在这里已经有答案了 我在创建指向类方法的函数指针时遇到问题 我创建了一个指向非类方法的函数指针 它工作得很好 int foo return 5 int main int pointer foo std cout lt lt poin
  • 如何检测该参数是两个任意类型的元组?

    我实际上正在做的事情更复杂 但归根结底是能够实现函数来检测某个东西是一个元组 无论其元素的类型是什么 这是我的方法 不起作用 请参阅最后一行的评论 func isTuple b Any gt Bool return b is Any Any