arrays - 为什么 Swift 在将多个类型项放入数组时不对 Any 进行类型推断

标签 arrays swift types type-inference anyobject

使用Xcode 7.1开发swift 2.2时有两种情况让我很困惑,请看下面的例子,谢谢

首先,当导入 Foundation 时,我声明了一个包含两个项目的 testArray,一个整数类型 1 和一个字符串类型“hello”,我的问题是为什么 Swift 类型推断 testArray 为 Array(NSObject) 而不是 Array(Any)

import Foundation
let testArray = [1, "hello"] 
print(testArray.dynamicType) //testArray is Array<NSObject>

其次,当我删除 import Foundation 时,下面的代码无法编译,错误消息是“Type of expression is ambiguous without more content”,我的问题是为什么 Swift 不对 Array(Any) 进行类型推断情况,谢谢帮助

let testArray2 = [2, "world"]
print(testArray2) 
//can't compile, error message = "Type of expression is ambiguous without more content"

最佳答案

/// The protocol to which all types implicitly conform.
public typealias Any = protocol<>

Any 只是一个所有类型都隐式遵守的协议(protocol)——它本身并不是具体类型。 Swift 无法推断出非具体类型的数组,这就是为什么它无法推断出 Any,但可以成功推断出 NSObject(Int 可以桥接NSNumberString 可以桥接到 NSString - 它们都继承自 NSObject,这是一个具体类型).

例如,考虑一下:

protocol Foo {}
struct Bar:Foo {}
struct Baz:Foo {}

let arr = [Bar(), Baz()] // error: Type of expression is ambiguous without more context

因为 Foo 是一个非具体类型,Swift 无法推断出它的数组。你必须明确地告诉编译器你想要它的类型是什么:

let arr:[Foo] = [Bar(), Baz()]

您还将获得与 AnyObject 相同的行为(因为它是所有 隐式遵守的协议(protocol) – 但仍然不是具体类型):

class Qux {}
class Fox {}

let a = [Qux(), Fox()] // error: Type of expression is ambiguous without more context

let a1:[AnyObject] = [Qux(), Fox()] // no error

为什么 Swift 无法推断非具体类型的数组很可能是由于语言中非具体类型的现有限制——目前大多数重要的事情都需要具体类型操作。 See this great Q&A for an example .

但老实说,您真的应该更多地考虑您是否实际上需要Any 数组。我想不出有 Any 数组的单个实际应用程序,因为因为所有内容都隐含地符合元素,所以必须保证它们什么都不做(你不能调用特定的方法可以是任何东西)。您当然可以进行类型转换,但是恢复您一开始就放弃的类型安全有什么意义呢?

您应该始终尽可能地特定于类型。您可以为您的值构建一个包装器——这可以是一个简单的 struct 来包装几个属性,或者一个 type erasure为了将非具体类型包装在伪具体类型中。至少,您应该考虑创建自己的数组元素符合的协议(protocol)。

关于arrays - 为什么 Swift 在将多个类型项放入数组时不对 Any 进行类型推断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37024097/

相关文章:

swift - Swift 的 `reduce` 语法有问题

scala - 为什么 Unit 不在 Scala 中扩展 Product?

c++ - 对齐 SSBO 的内存(它是包含数组的结构数组)?

ios - 用户快速滚动表格 View 时如何隐藏和取消隐藏导航栏?

ios - 无法更改 SplitViewController 中状态栏的颜色

php - MySQL 整数字段在 PHP 中作为字符串返回

在实模式下用 Bresenham 的线算法计数,汇编

java - 读取文件并添加到二维 double 组中

c - 如何在c中返回指向数组的指针

Python – ValueError : The truth value of an array with more than one element is ambiguous. 使用 a.any() 或 a.all()