【问题标题】:Is it possible to avoid struct mutation in swift?是否可以快速避免结构突变?
【发布时间】:2014-11-18 03:39:22
【问题描述】:

是否可以让 struct 表现得像一个对象。 F.e.:

var arr = [1]
let arr1 = arr 
arr.append(1)

我想让 arr1 与 arr 相同。包装成一个对象是唯一的选择吗?

【问题讨论】:

标签: swift


【解决方案1】:

您所描述的是 Swift 中结构和对象之间行为的根本区别之一。结构总是按值复制。所以不,如果你想通过引用语义复制,你将不得不使用一个对象。

【讨论】:

    【解决方案2】:

    除了@ChrisK 的回答之外,我看不到从不同变量引用同一个数组的许多实际用途,除非您想要实现的是将它传递给函数/方法 - 在这种情况下,您 可以使用inout修饰符通过引用传递:

    var array = [1, 2, 3]
    
    func changeArray(inout array: [Int]) {
        array.append(4)
    }
    
    changeArray(&array)
    

    阅读更多关于In-Out Parameters

    更新您在评论中提到了一个非常好的用例。这让我找到了一个解决方案,它更像是一种解决方法 - 重要的是它有效。

    使用 NSMutableArray 而不是 swift 数组。这是一门课程,因此它具有您正在寻找的所有优势。操场上的示例:

    var arr: NSMutableArray = [
        NSMutableArray(array: [1, 2, 3])
    ]
    
    arr[0].addObject(4)
    arr[0].replaceObjectAtIndex(0, withObject: -1)
    arr // This prints [[-1, 2, 3, 4]]
    

    【讨论】:

    • 拥有一个数组怎么样?如果我想更改“行”数组,我必须重新分配它。
    • 好点。这是少数派上用场的情况之一。我认为如果你想达到这个目标,你应该在你的问题中明确说明。
    • 查看更新的答案。我认为NSMutableArray 是您要找的。​​span>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 2016-11-09
    • 2018-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多