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
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' ... –
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
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! –