Tôi sẽ cập nhật câu trả lời của mình cho khả năng tương thích nhanh 3.
Khi bạn lập trình nhiều, bạn cần phải thay đổi một số giá trị của các đối tượng nằm trong bộ sưu tập. Trong ví dụ này, chúng ta có một mảng cấu trúc và đưa ra một điều kiện chúng ta cần phải thay đổi giá trị của một đối tượng cụ thể. Đây là một điều rất phổ biến trong bất kỳ ngày phát triển nào.
Thay vì sử dụng chỉ mục để xác định đối tượng nào phải được sửa đổi Tôi thích sử dụng điều kiện if, IMHO phổ biến hơn.
import Foundation
struct MyStruct: CustomDebugStringConvertible {
var myValue:Int
var debugDescription: String {
return "struct is \(myValue)"
}
}
let struct1 = MyStruct(myValue: 1)
let struct2 = MyStruct(myValue: 2)
let structArray = [struct1, struct2]
let newStructArray = structArray.map({ (myStruct) -> MyStruct in
// You can check anything like:
if myStruct.myValue == 1 {
var modified = myStruct
modified.myValue = 400
return modified
} else {
return myStruct
}
})
debugPrint(newStructArray)
Lưu ý tất cả các cách cho phép, cách phát triển này an toàn hơn.
Các lớp là loại tham chiếu, không cần thiết phải tạo bản sao để thay đổi giá trị, giống như nó xảy ra với cấu trúc. Sử dụng cùng một ví dụ với các lớp học:
class MyClass: CustomDebugStringConvertible {
var myValue:Int
init(myValue: Int){
self.myValue = myValue
}
var debugDescription: String {
return "class is \(myValue)"
}
}
let class1 = MyClass(myValue: 1)
let class2 = MyClass(myValue: 2)
let classArray = [class1, class2]
let newClassArray = classArray.map({ (myClass) -> MyClass in
// You can check anything like:
if myClass.myValue == 1 {
myClass.myValue = 400
}
return myClass
})
debugPrint(newClassArray)
Xem thêm [loại giá trị so với loại lớp] (http://stackoverflow.com/a/41353620/5175709) Rob nói chính xác: * nếu bạn chuyển loại giá trị làm tham số cho phương thức một cái gì đó trên một chủ đề khác, về cơ bản bạn đang làm việc với một ** bản sao ** của loại giá trị đó. Điều này đảm bảo tính toàn vẹn của đối tượng đó được truyền cho phương thức. * – Honey