gpt4 book ai didi

swift - 双数的类型在 Swift 中是 Int

转载 作者:搜寻专家 更新时间:2023-10-31 08:15:22 25 4
gpt4 key购买 nike

// Swift
import UIKit
let arr = [1, "a", 2.88]
let last = arr.last
if last is Int {
print("The last is Int.") // The last is Int.
} else {
print("The last is not Int.")
}

我无法理解打印的结果。
为什么它打印“最后一个是 Int”。

// Swift
import UIKit
let arr = [1, "a", -2]
let last = arr.last
if last is Double {
print("The last is Double.") // The last is Double.
} else {
print("The last is not Double.")
}

还有这个打印“The last is Double”。为什么?
有人可以帮助我吗?
比你差很多。

最佳答案

Swift 数组只能容纳一种类型。当你声明:

let arr = [1, "a", 2.88]

Swift 制作了 [NSObject] 类型的 arr。您可以通过 Option 验证这一点-单击 arr 以查看其类型。这只有效,因为您导入了 Foundation(您的 import UIKit 也导入了 Foundation)。尝试删除 import UIKit

然后,值 12.88 被转换为 NSNumber"a" NSString 以便它们可以存储在 [NSObject] 数组中,因为 IntStringDouble 不是 NSObjectsNSNumberNSStringNSObject 的子类。 Swift 为数组选择最严格的类型。如果您的数组是 [1, true, 2.88],则数组类型将是 [NSNumber]

NSNumber 的有趣之处在于它是一个包装了许多不同类型的对象容器。您可以放入一个Int 并取出一个Double。因此,当您使用 is 测试它时,它会产生误导。它响应“真实”的意思,“如果你愿意,我可以成为那样的人”。


import Foundation

let n: NSNumber = 3.14

print(n is Int) // "true"
print(n is Double) // "true"
print(n is Bool) // "true"

print(n as! Int) // "3"
print(n as! Double) // "3.14"
print(n as! Bool) // "true"

注意:如果您将 arr 声明为 [Any],那么这将按您的预期工作:

let arr:[Any] = [1, "a", 2.88]
let last = arr.last
if last is Int {
print("The last is Int.")
} else {
print("The last is not Int.") // "The last is not Int."
}

但 Swift 不会为你创建类型为 Any 的数组,除非你明确要求(因为坦率地说,这在强类型语言中是令人厌恶的)。如果您发现自己正在使用 [Any],您可能应该重新考虑您的设计。

Swift 在导入 Foundation 时创建 [NSObject] 的唯一原因是让我们在调用 CocoaCocoa 时更轻松触摸 API。如果此类 API 需要传递 NSArray,您可以发送 [1, "a", 2.88] 而不是 [NSNumber(integer: 1), NSString(string: "a"), NSNumber(double: 2.88)].

关于swift - 双数的类型在 Swift 中是 Int,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36822466/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com