2016-04-22 19 views
17

Là hai cách tiếp cận tương tự hoặc có sự khác biệt lớn/cạm bẫy phải nhận thức được:Sự khác nhau giữa cấu trúc đơn dựa trên lớp và dựa trên lớp là gì?

class MyClassSingleton { 
    static let sharedInstance = MyClassSingleton() 
    private init(){} 

    func helloClass() { print("hello from class Singleton") } 
} 

struct MyStructSingleton { 
    static let sharedInstance = MyStructSingleton() 
    private init() {} 

    func helloStruct() { print("hello from struct Singleton") } 
} 

Trả lời

30

Sự khác biệt chính là singleton có thể thay đổi dựa trên lớp, trong khi "singleton" có cấu trúc dựa trên cấu trúc thì không. Trừ khi bạn muốn làm cho singleton của bạn không thay đổi (đó là hiếm), bạn nên dính vào một lớp học dựa trên.

Đây là minh họa về cách "singleton" dựa trên cấu trúc có thể thay đổi không hoạt động. Hãy xem xét thêm một thành viên có thể thay đổi state cho cả độc thân, như thế này:

class MyClassSingleton { 
    static let sharedInstance = MyClassSingleton() 
    private init(){} 
    var state = 5 
    func helloClass() { print("hello from class Singleton: \(state)") } 
} 

struct MyStructSingleton { 
    static let sharedInstance = MyStructSingleton() 
    private init() {} 
    var state = 5 
    func helloStruct() { print("hello from struct Singleton: \(state)") } 
} 

tôi đã state một var, nhưng tôi có thể tiếp xúc với nó như là một thuộc tính chỉ đọc cộng với một phương pháp mutating; điều quan trọng là cả hai loại đều có thể thay đổi.

Nếu tôi làm điều này

let csi = MyClassSingleton.sharedInstance 
csi.state = 42 
MyClassSingleton.sharedInstance.helloClass() 

42 được in, vì csi là tham khảo các trường hợp chia sẻ.

Tuy nhiên, khi tôi làm điều tương tự với cấu trúc dựa trên singleton

var ssi = MyStructSingleton.sharedInstance 
ssi.state = 42 
MyStructSingleton.sharedInstance.helloStruct() 

5 được in thay vào đó, vì ssi là một bản sao của sharedInstance, đó là, tất nhiên, một dấu hiệu cho thấy singleton của chúng tôi là không thực sự là một singleton.

+0

thú vị, bằng cách sử dụng 'static var sharedInstance' thay vì' static let sharedInstance' làm cho nó xuất hiện để hoạt động. Là một bản sao mới của cấu trúc được tạo ra mỗi khi tôi gọi 'MyStructSingleton.sharedInstance'? –

+1

@RunningTurtle Một bản sao mới của 'MyStructSingleton' được tạo ra khi bạn khai báo một biến mới của kiểu' MyStructSingleton'. Khi bạn gán 'sharedInstance' cho nó, cả hai trở nên giống nhau, nhưng chúng không giống nhau. Điều tương tự cũng xảy ra khi bạn truyền 'MyStructSingleton' làm tham số hoặc trả về nó từ một phương thức. – dasblinkenlight

2

Điều đó phụ thuộc vào những gì bạn muốn đạt được và làm thế nào bạn muốn sử dụng cấu trúc của bạn dựa trên sự khác nhau giữa classstruct . Điều phổ biến nhất mà bạn sẽ thấy là sử dụng class với đối tượng singleton.

Singletons được khá nhiều giống nhau, họ chỉ tạo ra một lần, nhưng bạn sẽ có những tác động khác nhau từ class và từ struct vì:

  • Lớp học là kiểu tham chiếu, trong khi cấu trúc là kiểu giá trị
  • Các cấu trúc được sử dụng để xác định cấu trúc đơn giản
  • Không thể kế thừa các đường dẫn

Có một số khác biệt khác nhau nhưng bạn có được ý tưởng từ điều này.

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