ฉันจะสร้างคลาสเมธอด / คุณสมบัติใน Swift ได้อย่างไร


98

เมธอดคลาส (หรือแบบคงที่) ใน Objective-C สามารถทำได้โดยใช้+ในการประกาศ

@interface MyClass : NSObject

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

@end

สิ่งนี้จะทำได้อย่างไรใน Swift

คำตอบ:


153

พวกเขาจะเรียกคุณสมบัติประเภทและวิธีการประเภทและคุณใช้classหรือstaticคำหลัก

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
ฉันไม่คิดว่ามัน จำกัด เฉพาะ Playground แต่ก็ไม่ได้รวบรวมไว้ในแอพด้วย
Erik Kerber

@ErikKerber น่ารู้ยังไม่ต้องการเลยยังไม่ได้ทดสอบด้วยตัวเองขอบคุณ
Pascal

Xcode 6.2 ยังคงรายงาน 'ตัวแปรคลาสที่ยังไม่รองรับ' กับอะไรก็ตามในรูปแบบ 'class var varName: Type'
Ali Beadle

ใน Swift 2.0+ คุณไม่จำเป็นต้องใช้classคีย์เวิร์ดก่อนฟังก์ชันหรือคุณสมบัติประเภทที่คำนวณ
Govind Rai

21

พวกเขาเรียกว่าคุณสมบัติประเภทและวิธีการพิมพ์ใน Swift และคุณใช้คีย์เวิร์ดคลาส
การประกาศเมธอดคลาสหรือเมธอด Type อย่างรวดเร็ว:

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

การเข้าถึงวิธีการนั้น:

SomeClass.someTypeMethod()

หรือคุณสามารถอ้างอิงวิธีการได้อย่างรวดเร็ว


ขอบคุณมาก! มันง่ายกว่าคลาส NSObject ใน Objective-C และติดตั้งได้ค่อนข้างง่าย
Supertecnoboff

15

นำหน้าการประกาศด้วยclassif เป็นคลาสหรือด้วยstaticถ้าเป็นโครงสร้าง

class MyClass : {

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

คุณไม่ต้องการfuncคำหลักที่นี่หรือ?
Jamie Forrest

1
แน่นอน. ทำหน้าที่ตอบคำถามขณะยืนอยู่บนรถบัสที่แออัดฮ่า ๆ แก้ไข.
ไฟล์อนาล็อก

4

Swift 1.1 ไม่มีคุณสมบัติของคลาสที่เก็บไว้ คุณสามารถใช้งานได้โดยใช้คุณสมบัติคลาสการปิดที่ดึงอ็อบเจ็กต์ที่เชื่อมโยงกับคลาสอ็อบเจ็กต์ (ใช้ได้เฉพาะในคลาสที่มาจาก 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))
        }
    }

    ....
}

ฉันได้เรียนรู้ Swift และสงสัยว่าคุณสามารถแนบวัตถุที่เกี่ยวข้องกับอินสแตนซ์คลาส Swift ได้หรือไม่ ดูเหมือนว่าคำตอบคือ "เรียงลำดับ" (ใช่ แต่เฉพาะออบเจ็กต์ที่เป็นคลาสย่อยของ NSObject เท่านั้น) ขอบคุณที่แก้ไขให้ฉัน (โหวต)
Duncan C

4

นำหน้าการประกาศด้วยคลาสหรือแบบคงที่ถ้าเป็นฟังก์ชันหรือแบบคงที่ถ้าเป็นคุณสมบัติ

class MyClass {

    class func aClassMethod() { ... }
    static func anInstanceMethod()  { ... }
    static var myArray : [String] = []
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.