2014-10-28 15 views
25

Tôi muốn tạo một mảng toàn cục các đối tượng tùy chỉnh có thể được truy cập trong suốt ứng dụng (các lớp AppDelegate, ViewController, các lớp TableViewController, v.v.). Tôi đã nghiên cứu cho một cách để làm điều đó, nhưng đã không tìm thấy một câu trả lời. Tôi đã cố gắng tạo mảng cho phạm vi công cộng, nhưng tôi nhận được cảnh báo complier có nội dung là Declaring public variable from internal class và khi tôi cố truy cập vào tệp khác, tôi nhận được thông báo lỗi: Use of unresolved identifier 'arrayObjectives'Tuyên bố các biến toàn cục trong Swift

Làm cách nào để thực hiện điều đó mảng có thể truy cập trên toàn cầu đối với tất cả các tệp trong ứng dụng và tôi sẽ khởi tạo mảng đó ở đâu?

Trả lời

21

Từ Swift Programming Language -

biến toàn cầu là các biến được định nghĩa bên ngoài của bất kỳ chức năng, phương pháp, đóng cửa, hoặc gõ bối cảnh

Vì vậy, bạn chỉ có thể khai báo biến của bạn tại đầu bất kỳ tệp nào ngay sau câu lệnh import.

Tuy nhiên, tôi khuyên bạn nên xem xét lại nghiêm túc. Nói chung globals không phải là một ý tưởng tốt. Bạn tốt hơn với các thuộc tính trên một singleton hoặc sử dụng tiêm phụ thuộc.

Câu hỏi thứ hai của bạn "Tôi sẽ khởi tạo mảng ở đâu?" là một phần của lý do tại sao globals là xấu - vòng đời của họ không được xác định rõ ràng về các đối tượng khác của bạn. Một singleton được khởi tạo trong lần sử dụng đầu tiên sẽ loại bỏ vấn đề này.

+1

Nếu bạn sử dụng 'private' làm công cụ sửa đổi truy cập, biến toàn cục sẽ chỉ toàn cục trong tệp nhanh mà bạn khai báo ... Điều này khá hữu ích trong trường hợp bạn muốn biến tĩnh (như' lớp' chưa được hỗ trợ) – Soko

+1

Globals là một phần hoàn toàn tự nhiên và thành ngữ của Swift. – Fattie

+1

Chắc chắn, và C và một loạt các ngôn ngữ khác. Nó vẫn không có nghĩa là họ là một ý kiến ​​hay. Hằng số toàn cục là OK nhưng các biến toàn cầu có nhiều hạn chế trong môi trường đa luồng, hướng đối tượng, không đồng bộ. – Paulw11

13

Bạn có thể đặt Mảng toàn cầu như theo cách này:

import UIKit 

var abc : String = String() 

và bạn có thể truy cập nó trong bất kỳ tập tin khác như:

abc = "ABC" 
+0

Tôi sẽ đặt nó ở đâu? Tôi biết tôi không thể làm điều đó trong một chức năng, nhưng khi tôi cố gắng làm điều đó trong một lớp học, tôi nhận được cảnh báo complier được đề cập ở trên. –

+1

Chính xác nơi chúng cho bạn thấy - bên ngoài bất kỳ hàm hoặc lớp – Paulw11

+0

có cách này chúng ta có thể khai báo và truy cập các biến toàn cầu .. :) –

5

Đây là cách tôi đã làm nó ...

class MessageViewCell { 
    struct MessageViewCellHeightCache { 
     static var cache: [String:CGFloat] = Dictionary<String, CGFloat>() 
    } 
} 

Và tôi đã truy cập nó như sau:

MessageViewCell.MessageViewCellHeightCache.cache["first"] = 12.0 
+2

Đây không phải là toàn cầu. Nó là một mẫu đơn – Paulw11

+0

@ Paulw11 - singleton là tốt nhất cho các loại kịch bản –

+2

Tôi đồng ý - xem câu trả lời của tôi. Câu trả lời này không làm nổi bật rằng nó là một singleton không phải là một toàn cầu. – Paulw11

7

Hãy thử làm một file Swift mới với điều này:

struct Constants { 

    static let appName: String = "My App" 

    struct Colors { 

    static let colorTextStandard = UIColor(red: 0/255, green: 0/255, blue: 0/255, alpha: 0.3) //#000000 

    } 

    struct Data { 

    static var myStrings = [String]() // Yea, this is not a constant, but that's alright... 

    } 

} 

Sau đó bạn có thể tham khảo những hằng số toàn cầu (hoặc bạn có thể làm cho họ biến) sử dụng:

Constants.appName 

hoặc

Constants.Colors.colorTextStandard 

hoặc

Constants.Data.myStrings = [stringOne, stringTwo] 
Các vấn đề liên quan