gpt4 book ai didi

swift - 为什么 `var objCArray = array as NSArray`是合法的?

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

在 Swift 数组和 NSArrays 之间转换很容易。我发现了一个我认为不应该编译的案例:

let doubleArray = [1.1, 2.22, 3.333, 4.4444, 5.55555, 
6.666666, 7.7777777, 8.88888888, 9.999999999]

var objCArray = doubleArray as NSArray

第二行从我的 Swift double 组创建了一个 NSArray,但它存储在 var 中。这将测试编译器更改数组内容是否合法。这意味着如果您随后尝试改变数组,您会得到一个错误,即使 objCArray 被声明为 var:

objCArray[0] = 123

为什么行 var objCArray = doubleArray as NSArray 是合法的?

最佳答案

let doubleArray = [1.1, 2.22, 3.333, 4.4444, 5.55555, 6.666666, 7.7777777, 8.88888888, 9.999999999]
var objCArray = doubleArray as NSArray

Why is the line var objCArray = doubleArray as NSArray legal

因为,与所有其他 var 声明一样,它允许您替换变量的值。在这种情况下,您可以将 objCArray 处的 NSArray 替换为不同 NSArray:

objCArray = [2.9]

然而,NSArray 本身是不可变的。这只是这个 Objective-C 类的一个事实。因此,例如,您不能分配给 objCArray[0]。这与此处的 letvar 无关;这是关于 NSArray 本身是什么的事实:

 objCArray[0] = 123 // error

现在,您可能会说:这与 Swift 结构的工作方式完全不同。非常真实!但是 NSArray 不是 Swift 结构。它不是 Swift,也不是结构。这是一个 Objective-C 类! Swift 数组是一个 Swift 结构,您应该改用它。


进一步讨论:就目前而言,这个问题显然是荒谬的,即使只关注 Swift 结构,我们也能看出这一点:

  • 如果结构引用本身是用 var 声明的,那么您可以在 Swift 中为结构的 var 属性赋值>.

  • 不允许在 Swift 中分配给结构的 let 属性,即使如果结构引用本身是用 var 声明。

  • 但这并不意味着,仅仅因为一个结构体只有let 属性,它就不能用var 来声明!那将是荒谬的。然而,这种荒谬与您问题中的荒谬完全相同。

    struct S {
    let name = "Matt"
    }
    var s = S() // should this be illegal...
    // ... just because assigning to S.name is illegal???

关于swift - 为什么 `var objCArray = array as NSArray`是合法的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42566417/

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