【问题标题】:swift :changing the content of an array gives me an errorswift:更改数组的内容给我一个错误
【发布时间】:2016-06-29 00:34:33
【问题描述】:

我有这个数组:

var array = [[12,46,["a","b","c"],"nil",true,7,true],[10,40,["c","d","e"],"nil",true,7,true],[0,1,["z","l","w"],"hey",false,7,true]].

当我尝试通过此代码更改数组布尔值的最后一个布尔值时:

array[0][6] = false

我收到此错误“无法通过下标分配下标是 get-only 数组”

【问题讨论】:

    标签: arrays xcode swift


    【解决方案1】:

    有趣。我认为编译器在某个地方出错了。您只需检查数组的类型即可了解原因:

    var array = [
        [12,46,["a","b","c"],"nil",true,7,true],
        [10,40,["c","d","e"],"nil",true,7,true],
        [0,1,["z","l","w"],"hey",false,7,true]
    ]
    
    print(array.dynamicType) // Array<NSArray>
                             // can't assign to the inner array since NSArray is immutable
    

    给 Swift 一个内部类型的提示,它可以工作

    var array: [[AnyObject]] = [
        [12,46,["a","b","c"],"nil",true,7,true],
        [10,40,["c","d","e"],"nil",true,7,true],
        [0,1,["z","l","w"],"hey",false,7,true]
    ]
    
    array[0][6] = false     // works
    

    【讨论】:

    • 不知为何Swift编译器默认为非Swift原生类型NSArray
    【解决方案2】:

    您应该改用元组数组。编写更好的代码,性能更好,并且不依赖于 Objective-C:

    var array = [
        (12,46,["a","b","c"],"nil",true,7,true),
        (10,40,["c","d","e"],"nil",true,7,true),
        (0,1,["z","l","w"],"hey",false,7,true)
    ]
    
    // Array has type [(Int, Int, [String], String, Bool, Int, Bool)]
    
    array[0].6 = false
    

    【讨论】:

    • 这阐明了程序员的意图,特别是因为外部数组的所有条目都具有相同的结构(IntInt[String]StringBoolInt , Bool)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-06-17
    • 1970-01-01
    • 1970-01-01
    • 2019-12-25
    • 2019-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多