arrays - 为什么 Swift 有时会将混合类型数组视为单一类型数组?

标签 arrays swift types

我最近开始学习 Swift,对数组中类型的处理方式有些困惑。

根据我的理解,数组中可以有不同的类型。例如:

var arr = [1, 2, 3.0, 4, "myString"]

当我在 XCode Playground 中编写此代码并执行 println() 时,我得到了预期的输出:

[1, 2, 3.0, 4, "String"]

当我删除数组中的字符串时,我得到以下输出:

[1.0, 2.0, 3.0, 4.0]

为什么 Swift 将整数视为 double ?当我在 Playground 中运行以下代码时,这让我有些困惑:

import UIKit

var arr = [2.0, 3, 4, 5]

for (index, value) in enumerate(arr) {
    arr[index] = value / 2
}    

我期望得到以下输出:

[1.0, 1, 2, 2]

但输出是:

[1.0, 1.5, 2.0, 2.5]

为什么 Swift 会自动更改 int 的类型?

最佳答案

From my understanding an array can have different types within it.

这种理解是不正确的,数组只能包含一种特定类型。

事实上,如果您将原始示例输入到不包含其他内容(即删除“import UIKit”或“import Cocoa”语句)的 Playground 中,它将无法编译。

Swift 标准库中的 Array 结构如下所示:

struct Array<T> : MutableCollectionType, Sliceable {
    // methods and properties
}

T 是一个“通用占位符”。当你声明一个数组时,它被替换为数组包含的类型。但是T只能是一种类型。

当你声明一个变量而不指定类型时,Swift 会尝试“推断”类型。也就是说,它将从上下文中找出所有可能的类型,并根据一组(相当广泛的)规则选择一个。

DoubleInt 都符合IntegerLiteralConvertible 协议(protocol)。这意味着您可以从诸如 1 的文字创建。但是,Int 是默认值。如果你想要一个 Double,你需要明确。

// i will be an Int, the default
let i = 1
// j will also be an Int
let j: Int = 1
// k will be a Double
let k: Double = 1

Double 也符合 FloatLiteralConvertible,但 Int 不符合:

// f will be a Double, the default:
let f = 1.0
// or you can declare a Float:
let g: Float = 1.0
// but this won’t work:
let h: Int = 1.0 // compiler error

当你声明一个数组时,类似地,Swift 会尝试找出数组包含的 T 类型。它列出了所有的可能性并选择了一个。在 [1.0, 1, 2] 的情况下,1.0 值排除了它包含 Int 的可能性,所以 T == Double 被选中。

同样,当你声明[1, 2, 3.0, 4, "String"]时,Double也被排除了。唯一可行的类型是遵循 IntegerLiteralConvertibleFloatLiteralConvertibleStringLiteralConvertible 的类型。 标准 Swift 类型库中没有可以做到这一点。

那么为什么您的原始示例有效?当您导入 UIKit 时,它会引入一个类型 NSObject,它确实可以做到这一点。所以 Swift 选择了它。

关于arrays - 为什么 Swift 有时会将混合类型数组视为单一类型数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27667058/

相关文章:

javascript - 查找具有必要键的对象数组并返回其值

ios - 后台模式 iOS 中的蓝牙

haskell - 为什么向工作函数添加 as-pattern 会导致编译错误?

php从两个数组创建html表,mysql查询产生额外的单元格

c - 如何从字符串数组转换为int数组,然后使用c对其进行排序

javascript - 如何按字母顺序对嵌套数组进行排序而不影响外部对象数组的顺序?

iOS10 后台获取

swift - 在 Swift 中将 cookie 添加到 webview.load

object - 类型断言非简约

types - 使用 MPI 和 Fortran 90 发送自定义类型