2015-09-02 21 views
5

Tôi đã lớp này tên Mealbản sao sâu sắc đối với mảng các đối tượng trong nhanh chóng

class Meal { 
    var name : String = "" 
    var cnt : Int = 0 
    var price : String = "" 
    var img : String = "" 
    var id : String = "" 

    init(name:String , cnt : Int, price : String, img : String, id : String) { 
     self.name = name 
     self.cnt = cnt 
     self.price = price 
     self.img = img 
     self.id = id 
    } 
} 

và tôi có một loạt các bữa ăn:

Tôi muốn lặp lại mảng đó và sau đó thực hiện một số thay đổi cho các trường hợp Bữa ăn ở một trong số chúng mà không thay đổi các trường hợp Bữa ăn trong trường hợp bữa ăn thứ hai, tôi sẽ tạo một bản sao sâu của nó như thế nào?

kết quả tìm kiếm này không giúp tôi How do I make a exact duplicate copy of an array?

Trả lời

9

Kể từ ordered là một mảng nhanh chóng, báo cáo kết quả

var orderedCopy = ordered 

có hiệu quả sẽ tạo một bản sao của mảng ban đầu.

Tuy nhiên, vì Bữa ăn là lớp, mảng mới sẽ chứa tham chiếu cho cùng các bữa ăn được đề cập trong tài liệu gốc.

Nếu bạn muốn sao chép nội dung các bữa ăn quá, để thay đổi một bữa ăn trong một mảng sẽ không thay đổi một bữa ăn trong mảng khác, sau đó bạn phải xác định Meal như một struct, không phải là một lớp:

struct Meal { 
    ... 

Từ Apple book:

Sử dụng struct để tạo ra một cấu trúc. Các cấu trúc hỗ trợ nhiều hành vi giống như các lớp, bao gồm các phương thức và khởi tạo. Một trong những sự khác biệt quan trọng nhất giữa các cấu trúc và các lớp là các cấu trúc luôn được sao chép khi chúng được truyền xung quanh trong mã của bạn, nhưng các lớp được chuyển qua tham chiếu.

8

Bạn phải, như @MarioZannone đã đề cập, biến nó thành cấu trúc, vì cấu trúc được sao chép tự động hoặc bạn có thể không muốn cấu trúc và cần lớp. Đối với điều này, bạn phải xác định làm thế nào để sao chép lớp học của bạn. Có giao thức NSCopying hợp nhất rằng trên thế giới ObjC, nhưng điều đó làm cho mã Swift của bạn "không chắc chắn" trong đó bạn phải kế thừa từ NSObject. Tôi đề nghị tuy nhiên để xác định giao thức sao chép riêng của bạn như thế này:

protocol Copying { 
    init(original: Self) 
} 

extension Copying { 
    func copy() -> Self { 
     return Self.init(original: self) 
    } 
} 

mà bạn có thể thực hiện như thế này:

class Test : Copying { 
    var x : Int 

    init() { 
     x = 0 
    } 

    // required initializer for the Copying protocol 
    required init(original: Test) { 
     x = original.x 
    } 
} 

Trong initializer bạn phải sao chép tất cả các tiểu bang từ trôi qua originalTest vào self. Bây giờ bạn đã thực hiện các giao thức một cách chính xác, bạn có thể làm một cái gì đó như thế này:

let original = Test() 
let stillOriginal = original 
let copyOriginal = original.copy() 

original.x = 10 

original.x   // 10 
stillOriginal.x // 10 
copyOriginal.x  // 0 

Đây là cơ bản giống như NSCopying chỉ mà không ObjC

EDIT: Đáng buồn là giao thức nhưng rất xinh đẹp này hoạt động rất kém với subclassing. ..

+0

w đây chính xác tôi nên đặt mã này, tôi đặt nó trong lớp Meal và nó làm cho lỗi tại extenction sao chép giao thức sao chép { init (bản gốc: Tự) } mở rộng sao chép { func copy() -> Tự { trở lại Self.init (bản gốc: tự) } } –

+0

@Alshcompiler Bạn có sử dụng phiên bản beta mới nhất không? – Kametrixom

+0

no i am sử dụng 6.4 –

8

Để cải thiện trên @Kametrixom kiểm tra câu trả lời này: Đối với đối tượng bình thường những gì có thể được thực hiện là để thực hiện một giao thức hỗ trợ sao chép, và làm cho lớp đối tượng thực hiện giao thức này như sau:

protocol Copying { 
    init(original: Self) 
} 

extension Copying { 
    func copy() -> Self { 
     return Self.init(original: self) 
    } 
} 

Và sau đó phần mở rộng mảng cho nhân bản:

extension Array where Element: Copying { 
    func clone() -> Array { 
     var copiedArray = Array<Element>() 
     for element in self { 
      copiedArray.append(element.copy()) 
     } 
     return copiedArray 
    } 
} 

và đó là khá nhiều nó, để xem mã số và một tấm séc mẫu này gist

+0

Nice cách tiếp cận, nhưng những gì về thừa kế? bạn có giải pháp thanh lịch nào không? –

Các vấn đề liên quan