2016-02-03 20 views
6

Trong Swift, chúng ta hãy nói rằng tôi muốn thêm một phương thức tĩnh mà trả về một thể hiện:Swift: Nhận lớp hiện tại từ một phương pháp tĩnh

class MyClass { 
    static func getInstance() { 
    return MyClass(someProperty); 
    } 
} 

Nhưng nếu tôi không muốn viết tên lớp ? Có tương đương với self nhưng đối với các phương pháp và thuộc tính tĩnh không?

Cùng ý tưởng nếu tôi muốn gọi một phương pháp tĩnh từ một phương pháp tĩnh:

class MyClass { 
    static func prepare(){ 
    //Something 
    } 

    static func doIt() { 
    MyClass.prepare(); 
    } 
} 

Tôi có thể làm điều này mà không sử dụng MyClass rõ ràng?

Trả lời

4

tự làm việc trong các phương pháp tĩnh quá, như thế này:

class MyClass { 
    static func prepare(){ 
    print("Hello"); 
    } 

    static func doIt() { 
    self.prepare(); 
    } 
} 
+0

Cảm ơn. Điều gì về 'self()'? Tôi nhận được một số lỗi nói rằng tôi cần 'self.init', và khi tôi nhận được một số lỗi khác mà tôi cần một initializer' required' ... –

+0

self() là không thể, nhưng tôi tự hỏi tại sao bạn muốn Để làm việc đó? dfri mô tả cách thực hành tốt nhất ở trên để tạo mẫu thiết kế Nhà máy. Đây là một mẫu khác: https://github.com/ochococo/Design-Patterns-In-Swift/blob/master/source/creational/factory.swift – RobbeR

+0

Lý do duy nhất tôi làm điều này là vì mã sẽ được sao chép được dán và phân phối cho người khác sử dụng. Tôi nghĩ những thứ ít mã hóa tốt hơn ... Cảm ơn! –

0

Như RobberR viết ở trên, bạn chỉ có thể sử dụng để truy cập vào chức năng self tĩnh của self, và self.init(...) ví dụ nhà máy của bạn. Lưu ý rằng bạn vẫn phải chỉ định MyClass làm kiểu trả về trong phương thức nhà máy của mình.

Là một cách tiếp cận khác, chung chung hơn, bạn có thể cho phép lớp của bạn tuân theo giao thức nhà máy có triển khai mặc định cho phương pháp nhà máy. Với phương pháp này, phương pháp nhà máy tĩnh không được gắn với bất kỳ lớp cụ thể nào, tuy nhiên có thể được truy cập bởi bất kỳ lớp nào phù hợp với giao thức nhà máy (và giao thức trợ giúp bổ sung cho công cụ khởi tạo chung). thiết lập

Factory:

protocol FactoryInitializers { 
    var commonProperty : Int { get set } 
    init(commonProperty: Int) 
} 

protocol FactoryMethods { 
    typealias T: FactoryInitializers 
    static var defaultStaticCommonProperty : Int { get } 
} 
extension FactoryMethods { 
    static func getInstance() -> T { 
     return T(commonProperty: defaultStaticCommonProperty) 
    } 
    static func getInstanceFor(commonProperty commonProperty: Int) -> T { 
     return T(commonProperty: commonProperty) 
    } 
} 

protocol Factory : FactoryMethods, FactoryInitializers { } 

Ví dụ lớp conformances:

class MyClass : Factory { 
    typealias T = MyClass 
    static var defaultStaticCommonProperty : Int = 1 

    var commonProperty : Int = 0 

    required init(commonProperty: Int) { 
     self.commonProperty = commonProperty 
    } 
} 

class MyOtherClass : Factory { 
    typealias T = MyOtherClass 
    static var defaultStaticCommonProperty : Int = 10 

    var commonProperty : Int = 0 

    required init(commonProperty: Int) { 
     self.commonProperty = commonProperty 
    } 
} 

Ví dụ sử dụng:

var foo = MyClass.getInstance() 
print(foo.dynamicType) // "MyClass" 
print(foo.commonProperty) // 1 
foo = MyClass.getInstanceFor(commonProperty: 5) 
print(foo.commonProperty) // 5 

var bar = MyOtherClass.getInstance() 
print(bar.dynamicType) // "MyOtherClass" 
print(bar.commonProperty) // 10 
0

Bạn có thể định nghĩa một giao thức và sử dụng swift generics như thế này:

protocol Vehicle { 
    init() 
} 

class MyVehicleFactory<T:Vehicle> { 
    static func getInstance() -> T { 
    return T() 
    } 
} 

Và những người sao chép mã của bạn có thể làm điều này:

class Car : Vehicle { 
    required init() { } 
} 
let car = MyVehicleFactory<Car>.getInstance(); 
Các vấn đề liên quan