स्विफ्ट में, निम्न की तरह कुछ अपने कार्य को पूरा करना चाहिए, लेकिन यह अपने 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 साथ, कि शायद के रूप में अच्छा है के रूप में आप स्विफ्ट में सीधे प्राप्त करने के लिए जा रहे हैं।
जितना अधिक मैंने यह समझने की कोशिश की कि यह कुछ सामान्य ओबीजेसी ट्रोप को कैसे बंद किया जाए, उतना ही मुझे एहसास हुआ कि यह सबसे तेज़ तरीका था। एक बार जब मैंने GPUImage में उदाहरण देखा, तो मुझे विश्वास था कि यह कम से कम आपका उत्तर था। :-)
अद्यतन 2: तो, विशिष्ट GPUImage उदाहरण मैं से जुड़ा हुआ अलावा ऊपर है कि स्विफ्ट, का उपयोग करता है और अधिक से अधिक मैं इस बारे में सोचते हैं, या तो सेटर समारोह की रक्षा के लिए एक where
खंड का उपयोग कर, या एक गणनीय संपत्ति का उपयोग कर 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
(वैकल्पिक रूप से, आप भी precondition(newValue is SpecialProtocol, "newValue did not conform to SpecialProtocol")
is
जांच के स्थान पर इस्तेमाल कर सकते हैं, लेकिन यह एक assert()
की तरह कार्य करेगा कर सकते हैं यदि मामला पूरा नहीं हुआ है तो ऐप को क्रैश करें। आपकी ज़रूरतों पर निर्भर करता है।)
@ रिंटारो का जवाब एक अच्छा है, और यह एक अच्छा उदाहरण है where
एक गार्ड के रूप में खंड (दोनों अच्छे कार्यात्मक-ly, और स्विफ्ट-लाइ)। हालांकि, जब कंप्यूटेबल गुण मौजूद हैं, तो मुझे setFoo()
फ़ंक्शन लिखने से नफरत है। फिर फिर, एक कम्प्यूटेबल प्रॉपर्टी का उपयोग करने के लिए कोड गंध भी होती है, क्योंकि हम set
'एर में सामान्य प्रकार-बाधा लागू करने में सक्षम नहीं लगते हैं, और इन्हें प्रोटोकॉल अनुरूपता परीक्षण ऑनलाइन करना है।
मैं यहाँ पर एक ही बात से पूछा: http://stackoverflow.com/questions/24455327/how-do-i-specify-that-a-non-generic-swift-type-should- एक ही कारण के लिए comply-to-a-प्रोटोकॉल। –