当前位置: 首页 > 面试题库 >

Swift中的元组“转换”

商同化
2023-03-14
问题内容

如果我有带签名的元组,(String, Bool)则无法将其强制转换为(String, Any)。编译器说:

错误:无法表示元组转换((String,Bool)’到’(String,Any)’

但这应该可行,因为Bool可以安全地Any使用它as。如果执行类似的操作,几乎会引发相同的错误:

let any: Any = ("String", true)
any as! (String, Any) // error
any as! (String, Bool) // obviously succeeds

错误:

无法将类型’(Swift.String,Swift.Bool)’的值强制转换为’(protocol <>,protocol <>))

那么,有什么变通办法,尤其是对于第二种情况?因为您甚至无法转换Any(Any, Any)可以分别转换元素的任何元组。


问题答案:

即使元组可以包含类型,也不能强制转换。例如:

let nums = (1, 5, 9)
let doubleNums = nums as (Double, Double, Double) //fails

但:

let nums : (Double, Double, Double) = (1, 5, 9) //succeeds

您的解决方法是强制转换单个元素,而不是元组本身:

let tuple = ("String", true)
let anyTuple = (tuple.0, tuple.1 as Any)
// anyTuple is (String, Any)

这是Swift文档指出的原因之一:

元组对于相关值的临时组很有用。它们不适合创建复杂的数据结构。如果您的数据结构可能会在临时范围之外继续存在,则将其建模为类或结构,而不是元组。

我认为这是一个实现限制,因为元组是像函数一样的 复合类型 。同样,您不能创建元组的扩展名(例如extension (String, Bool) { … })。

如果您实际上使用的是会返回的API (String, Any),请尝试将其更改为使用类或结构。但是,如果您无力改善API,则可以switch使用第二个元素的类型:

let tuple : (String, Any) = ("string", true)

switch tuple.1 {

case let x as Bool:
    print("It's a Bool")
    let boolTuple = (tuple.0, tuple.1 as! Bool)

case let x as Double:
    print("It's a Double")
    let doubleTuple = (tuple.0, tuple.1 as! Double)

case let x as NSDateFormatter:
    print("It's an NSDateFormatter")
    let dateFormatterTuple = (tuple.0, tuple.1 as! NSDateFormatter)

default:
    print("Unsupported type")
}

如果API返回Any并且不能保证元组为(String, Any),那么您就不走运了。



 类似资料:
  • 问题内容: 我有一个功能: 排队 resultArray.append(tempDict) 我有一个错误: 调用中缺少参数“ ccomments”的参数 为什么?请帮助.... 问题答案: 在我看来,就像对待元组有点像可变参数,并试图扩展元组以匹配其自身的参数。它抱怨您的第二个参数,因为它只期待一个。我没有在任何地方看到这种行为的记录,因此我想说这是Swift中的错误。 使用追加运算符似乎没有这个

  • 本文向大家介绍Swift使用map(_ :)转换数组的元素,包括了Swift使用map(_ :)转换数组的元素的使用技巧和注意事项,需要的朋友参考一下 示例 如Array符合SequenceType,我们可以使用map(_:)转化的阵列A到阵列B使用类型的封闭(A) throws -> B。 例如,我们可以使用它将Ints数组转换为s数组,String如下所示: map(_:)将遍历数组,将给定的

  • Swift 4还引入了元组类型,用于在单个复合值中对多个值进行分组。 元组中的值可以是任何类型,并且不需要是相同类型。 例如,是一个具有两个值的元组,一个元素是字符串类型,另一个元素是整数类型。它是一个合法的数据。 当没有实现服务器上的某些东西时,让是一个错误,它返回两个值。 错误代码和说明。 可以根据需要从任意数量的不同数据类型创建元组。 下面是元组声明的语法 - 下面是一个元组声明 - 您可以

  • 问题内容: 这不再适用于Xcode 8 beta 6: 要么 错误是:上下文类型’CFArray’不能与数组文字一起使用 从数组转换为CFArray的最新方法是什么? 问题答案: 如果添加演员表,它将起作用: 或者您可以在通话中添加演员表: 在Swift 3(Xcode 8 beta 6)中,已删除对桥接类型的隐式转换。 在某些情况下,例如这种情况,您将需要添加显式强制转换以使其起作用。

  • 主要内容:元组转换为List/数组,集合/数组转换为元组,元组转换为List/数组的示例元组转换为List/数组 元组可以转换为List/数组,但以类型安全为代价,转换后的列表的类型为 List<Object>/Object[]。 集合/数组转换为元组 可以使用 fromCollection() 方法将集合转换为元组,使用 fromArray() 方法可以将数组转换为元组。 如果数组/集合的大小与元组的大小不同,则会发生 IllegalArgumentException。 元组转换为

  • 问题内容: 我想知道旋转JavaScript数组的最有效方法是什么。 我想出了这个解决方案,其中一个正数将数组向右旋转,而一个负数向左(): 然后可以使用这种方式: 在下面的评论中指出的那样,我上面的原始版本有一个缺陷,那就是正确的版本(附加返回值允许链接): 是否有可能在JavaScript框架中更紧凑和/或更快速的解决方案?(以下任何一种建议的版本都不会更紧凑或更快速) 有没有内置数组旋转的J