2015-06-24 21 views
15

Tôi đang học về mẫu Singleton theo cách nhanh chóng và hiệu quả để tạo ra một lớp Singleton và tìm ra cách tốt nhất để tạo ra như dưới đây.Làm thế nào để tạo đối tượng Singleton trong swift

class SingletonClass{ 
    static let sharedInstance = SingletonClass() 
} 

Kể từ khi tôi có sử dụng let tuyên bố nó là chỉ đọc tài sản và phải được chủ đề an toàn nên không có nhu cầu dispatch_once() như các Mục tiêu C.And static được sử dụng để làm cho biến sharedInstance như một class biến tôi đoán.

Nhưng làm thế nào điều này đảm bảo chỉ có một trường hợp được tạo trong suốt ứng dụng? Có một điều nhỏ mà tôi đang thiếu?

+2

Có bao nhiêu bản sao của lớp này (như trái ngược với đối tượng * * của lớp này) Bạn nghĩ sẽ có? –

+0

một bản sao của lớp này ... nhưng tôi có thể truy cập trang này dưới dạng SingletonClass.sharedInstance ở nhiều nơi ... –

+2

Bạn có cho rằng việc truy cập vào nó bằng cách nào đó tạo ra nhiều bản sao hơn? –

Trả lời

9

Điều gì đảm bảo nó chỉ được tạo một lần là từ khóa static. bạn có thể tham khảo bài viết này: https://thatthinginswift.com/singletons/

Hy vọng điều đó sẽ hữu ích.

Từ khóa tĩnh biểu thị rằng một biến thành viên, hoặc phương pháp, có thể truy cập mà không đòi hỏi một instantiation của lớp mà nó thuộc. Trong thuật ngữ đơn giản, nó có nghĩa là bạn có thể gọi một phương thức, thậm chí nếu bạn chưa bao giờ tạo ra các đối tượng mà nó thuộc về

+1

bạn có thể cập nhật định nghĩa tĩnh trong câu trả lời của bạn không? –

+1

bạn chỉ cần không khai báo tĩnh để bạn không cần phải tạo một đối tượng để truy cập biến? cụ thể hơn tại sao phải khai báo tĩnh trong trường hợp này? –

21

Nếu bạn muốn ngăn chặn instantiation của lớp học của bạn (có hiệu quả hạn chế sử dụng để chỉ singleton), sau đó bạn đánh dấu trình khởi tạo là private:

private init() 
{ 
    // initializer code here 
} 
+0

thanks..đây cũng là thứ tôi cần –

+0

nhưng tôi có thể tạo đối tượng..không cho tôi lỗi khi tạo đối tượng trong sân chơi –

+1

@copeME: Phương thức riêng chỉ có thể được gọi từ bên trong tệp mà chúng được khai báo. –

1

Bạn nói đúng. Và bạn có thể muốn đọc Files and Initialization về cách toàn cầu và biến tĩnh được xử lý trong Swift

Swift sử dụng phương pháp này

Initialize uể oải, chạy initializer cho một lần đầu tiên toàn cầu nó được tham chiếu, tương tự như Java.

Nó nói

nó cho phép initializers tùy chỉnh, thời gian khởi động trong Swift quy mô sạch không có initializers toàn cầu để làm chậm nó xuống, và thứ tự của thực hiện là hoàn toàn có thể dự đoán.

Các initializer lười biếng cho một biến toàn cầu (còn cho các thành viên tĩnh của cấu trúc và sự đếm) được chạy lần đầu tiên toàn cầu được truy cập, và được đưa ra như dispatch_once để đảm bảo rằng việc khởi tạo là nguyên tử. Điều này cho phép một cách tuyệt vời để sử dụng dispatch_once trong mã của bạn: chỉ cần khai báo một biến toàn cục với một trình khởi tạo và đánh dấu nó là riêng tư.

2

Hãy init tin, ví dụ:

final class Singleton { 

    // Can't init is singleton 
    private init() { } 

    //MARK: Shared Instance 

    static let sharedInstance: Singleton = Singleton() 

    //MARK: Local Variable 

    var emptyStringArray : [String] = [] 

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