Tôi muốn chuyển một mảng tới một đối tượng và lưu trữ một tham chiếu đến mảng này. Tôi muốn có thể sửa đổi mảng này trong đối tượng này và đảm bảo rằng nó được sửa đổi ở mọi nơi khác.Lưu trữ một tham chiếu đến mảng trong swift
Đây là những gì tôi đang cố gắng để thực hiện (cách mã không hoạt động)
class Foo {
var foo : Array<Int>
init(foo: Array<Int>) {
self.foo = foo
}
func modify() {
foo.append(5)
}
}
var a = [1,2,3,4]
let bar = Foo(a)
bar.modify()
print(a) // My goal is that it will print 1,2,3,4,5
phát hiện của tôi cho đến nay
A) Mảng (theo mặc định) được thông qua cách kỳ lạ. Đó là một tham chiếu cho đến khi bạn sửa đổi độ dài mảng. Ngay sau khi bạn sửa đổi độ dài, nó sẽ được sao chép và sửa đổi. Do đó, nếu tôi nối hoặc xóa bất kỳ thứ gì từ nó trong đối tượng, nó sẽ không được nhìn thấy bên ngoài
B) Tôi có thể sử dụng inout
trên tham số chức năng. Điều này sẽ cho phép tôi sửa đổi nó trong hàm này. Tuy nhiên, ngay sau khi tôi sẽ cố gắng gán nó cho một số thành viên đối tượng, tôi lại bị ấn tượng bởi A)
C) Tôi có thể bọc một mảng trong một số lớp Container. Đây có lẽ là cách sạch nhất. Tuy nhiên, tôi tuần tự hóa/deserialize các đối tượng này và tôi không muốn đặt nó trong Container (vì tôi sẽ phải làm việc xung quanh một số thứ cho serialization và deserialization và gửi nó đến máy chủ).
Còn gì khác không? Tôi có thiếu một số cấu trúc Swift cho phép tôi làm điều đó không?
Bạn muốn thay đổi "a" tuyên bố đó là hằng số như thế nào? Ngoài ra, bạn sẽ cần phải vượt qua nó bằng cách sử dụng tham số inout và vượt qua nó vào phương pháp của bạn với "&" tiền tố –
Tôi có thể thay đổi "a" là một var. Sử dụng & và tham số inout sẽ chỉ hoạt động nếu tôi sửa đổi mảng chỉ trong phương thức mà nó được truyền. Ngay khi tôi làm "self.foo = foo" nó sẽ ngừng hoạt động. Có nghĩa là sửa đổi self.foo sẽ không ảnh hưởng đến "a" –
khai báo nó là var, xác định var foo: [Int] = [] {willSet (newArray) {a = newArray}} –