当前位置 : 主页 > 手机开发 > 其它 >

swift – 为什么`var objCArray = array as NSArray`合法?

来源:互联网 收集:自由互联 发布时间:2021-06-11
在 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 NSAr
在 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双精度数组中创建一个NSArray,但它将它存储在var中.这测试编译器改变数组内容是合法的.这意味着如果你试图改变数组,你会得到一个错误,即使objCArray被声明为var:

objCArray[0] = 123

为什么line var objCArray = doubleArray作为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声明一样,它允许您替换变量的值.在这种情况下,您可以使用不同的NSArray替换objCArray中的NSArray:

objCArray = [2.9]

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

objCArray[0] = 123 // error

现在,您可能会说:这与Swift结构的工作完全不同.非常真实!但NSArray不是Swift结构.它不是Swift,它不是结构.这是一个Objective-C课程! Swift Array是一个Swift结构,你应该使用它.

进一步讨论:现在的问题显然是荒谬的,我们甚至可以通过专注于Swift结构来看到这一点:

>只有在使用var声明struct引用本身时,才允许在Swift中为结构的var属性赋值.
>不允许在Swift中为结构的let属性赋值,即使结构引用本身是用var声明的.
>但这并不意味着,仅仅因为结构只允许属性,它不能用var声明!那太荒谬了.然而,荒谬与你问题中的荒谬完全相同.

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