在斯威夫特,類似下面應該完成你的任務,但它比它的ObjC對應不同:
typealias GPUImageOutput = UIImage
@objc protocol GPUImageInput {
func lotsOfInput()
}
class GPUImageOutputWithInput: GPUImageOutput, GPUImageInput
{
func lotsOfInput() {
println("lotsOfInput")
}
}
// ...
var someGpuImage = GPUImageOutput()
var specificGpuImage = GPUImageOutputWithInput()
for image in [someGpuImage, specificGpuImage] {
if let specificImage = image as? GPUImageInput {
specificImage.lotsOfInput()
} else {
println("the less specific type")
}
}
更新:現在我明白的地方/你爲什麼有這些類型的...
GPUImage似乎有一個快速的例子,你想要做什麼,斯威夫特-LY越好。
見here:
class FilterOperation<FilterClass: GPUImageOutput where FilterClass: GPUImageInput>: FilterOperationInterface {
...
的type constraint syntax可以應用到的功能,也和一個where clause,這可能是一樣好,你會直接在斯威夫特得到。
我越試圖瞭解如何移植這個有點常見的objc變形,我越發現它是最迅速的方式。一旦我在GPUImage本身中看到了示例,我確信這至少是您的答案。 :-)
更新2:因此,除了上面鏈接到使用Swift的特定GPUImage示例,我越來越多地考慮使用where
子句來保護setter函數或使用可計算屬性過濾set
功能似乎是唯一的出路。
我想出了這樣的策略:
import Foundation
@objc protocol SpecialProtocol {
func special()
}
class MyClass {}
class MyClassPlus: MyClass, SpecialProtocol {
func special() {
println("I'm special")
}
}
class MyContainer {
private var i: MyClass?
var test: MyClass? {
get {
return self.i
}
set (newValue) {
if newValue is SpecialProtocol {
self.i = newValue
}
}
}
}
var container = MyContainer()
println("should be nil: \(container.test)")
container.test = MyClass()
println("should still be nil: \(container.test)")
container.test = MyClassPlus()
println("should be set: \(container.test)")
(container.test as? MyClassPlus)?.special()
輸出:
should be nil: nil
should still be nil: nil
should be set: Optional(main.MyClassPlus)
I'm special
(或者,您也可以在地方is
支票的使用precondition(newValue is SpecialProtocol, "newValue did not conform to SpecialProtocol")
,但會像一個assert()
可以如果沒有滿足的情況下崩潰的應用程序。取決於您的需求。)
@ rintaro的答案是一個很好的例子,是一個很好的例子where
子句作爲後衛(包括功能性很強和Swift-ly)。然而,我只是討厭在可計算屬性存在時編寫一個setFoo()
函數。然後,即使使用可計算屬性也有代碼異味,因爲我們似乎無法將通用類型約束應用於set
,因此必須在線執行協議一致性測試。
我問同樣的事情在這裏:http://stackoverflow.com/questions/24455327/how-do-i-specify-that-a-non-generic-swift-type-should-遵守協議,出於同樣的原因。 – 2014-10-21 16:57:05