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

前端之家收集整理的这篇文章主要介绍了swift – 为什么`var objCArray = array as NSArray`合法?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
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,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???

猜你在找的Swift相关文章