在 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
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???