Làm cách nào để tạo các phương thức / thuộc tính của lớp trong Swift?


97

Các phương thức lớp (hoặc tĩnh) trong Objective-C đã được hoàn thành bằng cách sử dụng +trong khai báo.

@interface MyClass : NSObject

+ (void)aClassMethod;
- (void)anInstanceMethod;

@end

Làm thế nào để đạt được điều này trong Swift?

Câu trả lời:


152

Họ được gọi là thuộc tính loạiphương pháp loại và bạn sử dụng classhoặc statictừ khóa.

class Foo {
    var name: String?           // instance property
    static var all = [Foo]()    // static type property
    class var comp: Int {       // computed type property
        return 42
    }

    class func alert() {        // type method
        print("There are \(all.count) foos")
    }
}

Foo.alert()       // There are 0 foos
let f = Foo()
Foo.all.append(f)
Foo.alert()       // There are 1 foos

5
Tôi không nghĩ rằng nó chỉ giới hạn ở Playground, nó cũng không biên dịch trong một ứng dụng.
Erik Kerber

@ErikKerber Thật tốt khi biết, chưa cần đến chúng nên tôi chưa tự kiểm tra, cảm ơn.
Pascal

Xcode 6.2 vẫn báo cáo 'các biến lớp chưa được hỗ trợ' đối với bất kỳ thứ gì có dạng 'lớp var varName: Type'.
Ali Beadle

Trong Swift 2.0+, bạn không cần classtừ khóa trước một hàm hoặc một thuộc tính kiểu tính toán.
Govind Rai

20

Chúng được gọi là thuộc tính kiểu và phương thức kiểu trong Swift và bạn sử dụng từ khóa class.
Khai báo một phương thức lớp hoặc phương thức Type trong nhanh chóng:

class SomeClass 
{
     class func someTypeMethod() 
     {
          // type method implementation goes here
     }
}

Truy cập phương pháp đó:

SomeClass.someTypeMethod()

hoặc bạn có thể tham khảo Phương pháp trong nhanh chóng


Cảm ơn bạn rất nhiều! Nó thậm chí còn dễ hơn một lớp NSObject trong Objective-C và điều đó đã khá dễ dàng để thiết lập.
Supertecnoboff

14

Thêm khai báo với classnếu đó là một lớp hoặc với staticnếu đó là một cấu trúc.

class MyClass : {

    class func aClassMethod() { ... }
    func anInstanceMethod()  { ... }
}

Bạn không cần functừ khóa ở đây?
Jamie Forrest

1
tất nhiên. Phục vụ tôi để trả lời câu hỏi khi đứng trên một chiếc xe buýt đông đúc, lol. Đã sửa.
Tệp tương tự

4

Swift 1.1 không có thuộc tính lớp được lưu trữ. Bạn có thể triển khai nó bằng cách sử dụng thuộc tính lớp bao đóng để tìm nạp một đối tượng được liên kết gắn với đối tượng lớp. (Chỉ hoạt động trong các lớp bắt nguồn từ NSObject.)

private var fooPropertyKey: Int = 0  // value is unimportant; we use var's address

class YourClass: SomeSubclassOfNSObject {

    class var foo: FooType? {  // Swift 1.1 doesn't have stored class properties; change when supported
        get {
            return objc_getAssociatedObject(self, &fooPropertyKey) as FooType?
        }
        set {
            objc_setAssociatedObject(self, &fooPropertyKey, newValue, objc_AssociationPolicy(OBJC_ASSOCIATION_RETAIN_NONATOMIC))
        }
    }

    ....
}

Tôi đã học Swift và tự hỏi liệu bạn có thể đính kèm các đối tượng liên quan vào các phiên bản của lớp Swift hay không. Có vẻ như câu trả lời là "đại loại". (Có, nhưng chỉ các đối tượng là lớp con của NSObject.) Cảm ơn bạn đã giải quyết vấn đề đó cho tôi. (Đã bình chọn)
Duncan C

4

Thêm khai báo với lớp hoặc static nếu đó là một hàm hoặc với static nếu đó là một thuộc tính.

class MyClass {

    class func aClassMethod() { ... }
    static func anInstanceMethod()  { ... }
    static var myArray : [String] = []
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.