में ब्लॉक/फ़ंक्शन/कॉल करने योग्य है या नहीं, यह जांचने के लिए स्विफ्ट में एक सरल और निश्चित तरीका है कि कुछ कॉल करने योग्य ब्लॉक/फ़ंक्शन है या नहीं? कुछ भाषाओं में यह एक छोटी सी चीज है, लेकिन शायद मैं इसे स्विफ्ट में गलत परिप्रेक्ष्य से देख रहा हूं? निम्नलिखित को धयान मे रखते हुए।जांचें कि चर एक स्विफ्ट
func foo(){ print("foo") }
var bar:() ->() = { print("bar") }
var baz:() -> (Bool) = { print("baz"); return true }
print(foo) // (Function)
print(bar) // (Function)
print(baz) // (Function)
print(foo is() ->()) // true
print(bar is() ->()) // true
print(baz is() ->()) // false
print(baz is() -> (Bool)) // true
स्विफ्ट जानता है कि वे सभी कार्य हैं, हालांकि ऐसा कोई डेटा प्रकार नहीं है। मैं एक ठोस हस्ताक्षर का उपयोग कर जांच कर सकता हूं, लेकिन ऐसी स्थिति हो सकती है जहां मुझे * हस्ताक्षर की परवाह नहीं है और बस इसे आमंत्रित करना चाहते हैं। उदाहरण के लिए:
func call(callable:() ->()) {
callable()
}
call(foo) // foo
call(bar) // bar
call(baz) // error: cannot convert value of type '() -> (Bool)' to expected argument type '() ->()'
मैं इसे इस, जो Void
और Bool
वापसी प्रकार के लिए काम करेंगे की तरह फिर से लिखने सकते हैं, लेकिन हर प्रकार के लिए यह कर रही है, पागल है, खासकर जब से मैं इसके बारे में परवाह नहीं है, लेकिन संकलक है ...
func call(callable: Any) {
if let block:() ->() = callable as?() ->() {
block()
} else if let block:() -> (Bool) = callable as?() -> (Bool) {
block()
}
}
call(foo) // foo
call(bar) // bar
call(baz) // truely baz
* सहमत, न हस्ताक्षर के बारे में देखभाल के एक पाप है। बहस के लिए चलो बस रिटर्न प्रकार की परवाह नहीं करते हैं।
मैं एक समस्या पर विचार किया जाएगा, आप केवल जानने की आवश्यकता नहीं है कि, अगर चर प्रतिदेय था लगता है, लेकिन अगर यह मानकों की उम्मीद है। अगर कुछ कॉल करने योग्य है तो यह जानना कोई मूल्य नहीं है यदि आप इसके पैरामीटर नहीं जानते हैं। –
सच है, इसलिए फुटनोट। –
लेकिन मैं वापसी प्रकार के बारे में बात नहीं कर रहा हूं। मैं पैरामीटर के बारे में बात कर रहा हूँ। –