क्लोजर के अंदर स्विफ्ट क्लोजर कॉलिंग - आईओएस, स्विफ्ट

मेरे पास निम्न कोड है:

  twitterAPI?.verifyCredentialsWithUserSuccessBlock({ (userName, password) -> Void in


twitterAPI?.getUserTimelineWithScreenName(userName, count: 100, successBlock: { ([AnyObject]!) -> Void in



}, errorBlock: { (error :NSError!) -> Void in

})



}, errorBlock: { (error :NSError!) -> Void in

println("error block")
})

मुझे निम्नलिखित त्रुटियां मिल रही हैं:

यहां छवि विवरण दर्ज करें

मैंने बाहरी बंद होने के अंदर स्वयं को कहने की कोशिश की लेकिन यह काम नहीं किया। मैं क्या खो रहा हूँ?

नवीनीकृत: अभी भी त्रुटियां बनाने:

यहां छवि विवरण दर्ज करें

अद्यतन: अगर मैं बंद करने के बाहर getUserTimeline विधि डालता हूं तो यह काम करता है। यह एक काम करता है।

//        twitterAPI?.getUserTimelineWithScreenName("", successBlock: { (objects :[AnyObject]!) -> Void in
//
//            }, errorBlock: { (error: NSError!) -> Void in
//
//        })

लेकिन यह नहीं करता है:

twitterAPI?.verifyCredentialsWithUserSuccessBlock({ (userName, password) -> Void in


self.twitterAPI?.getUserTimelineWithScreenName("", successBlock: { (objects :[AnyObject]!) -> Void in

}, errorBlock: { (error: NSError!) -> Void in

})



}, errorBlock: { (error :NSError!) -> Void in


})

अद्यतन: getUserTimeLine विधि की परिभाषा

self.twitterAPI?.getUserTimelineWithScreenName(<#screenName: String!#>, successBlock: <#(([AnyObject]!) -> Void)!##([AnyObject]!) -> Void#>, errorBlock: <#((NSError!) -> Void)!##(NSError!) -> Void#>)

यहां छवि विवरण दर्ज करें

अद्यतन: अब, मुझे लापता तर्क के रूप में एक बिल्ड त्रुटि मिल रही है। मैं उस कन्स्ट्रक्टर का भी उपयोग नहीं कर रहा हूं।

 if let twitterAPI = self.twitterAPI {

twitterAPI.verifyCredentialsWithUserSuccessBlock({ (userName, password) -> Void in

twitterAPI.getUserTimelineWithScreenName(userName, successBlock: { (objects :[AnyObject]!) -> Void in

}, errorBlock: { (error :NSError!) -> Void in

})


}, errorBlock: { (error :NSError!) -> Void in

})

}

उत्तर:

उत्तर № 1 के लिए 4

प्रयत्न:

        twitterAPI?.verifyCredentialsWithUserSuccessBlock({ (userName, password) -> Void in
self.twitterAPI?.getUserTimelineWithScreenName(userName, successBlock: { (objects :[AnyObject]!) -> Void in

}, errorBlock: { (error :NSError!) -> Void in
})

return  // <-- ADDED

}, errorBlock: { (error :NSError!) -> Void in
})

इस मामले में

{ (userName, password) -> Void in
self.twitterAPI?.getUserTimelineWithScreenName("", successBlock: { (objects :[AnyObject]!) -> Void in
}, errorBlock: { (error: NSError!) -> Void in
})
}

एक "एकल अभिव्यक्ति बंद" है जो निहित है Void वापसी।

एक्सकोड 6.2 / स्विफ्ट 1.1 के रूप में, आपको स्पष्ट की आवश्यकता है return यहाँ।

या, एक्सकोड 6.3 / स्विफ्ट 1.2 का उपयोग करें जिसने इस समस्या को ठीक किया है।

यह प्रश्न देखें: रिटर्न प्रकार के बिना एक लाइन बंद या स्विफ्ट - 'बूल' 'शून्य' का उप-प्रकार नहीं है?


उत्तर № 2 के लिए 1

ठीक है, आप जिन विधि नामों का उपयोग कर रहे हैं, उनके द्वारा, मैं अनुमान लगा रहा हूं कि आप इसका उपयोग कर रहे हैं STTwitter पुस्तकालय। यदि यह मामला है, तो आप इस तरह कुछ चाहते हैं:

    if let twitterAPI = self.twitterAPI {
twitterAPI.verifyCredentialsWithSuccessBlock({ (String) -> Void in
twitterAPI.getUserTimelineWithScreenName("test", successBlock: { (objects: [AnyObject]!) -> Void in
println("success")
}, errorBlock: { (error: NSError!) -> Void in
println("failure")
})
}, errorBlock: { (error: NSError!) -> Void in

})
}

वैकल्पिक का उपयोग करने से पहले कॉल कॉल पर ध्यान दें self.twitterAPI चर।


उत्तर № 3 के लिए 1

उदाहरण के लिए, सरल संस्करण। लेकिन बेहतर मोनड बनाओ

twitterAPI?.verifyCredentialsWithUserSuccessBlock({[weak self] (userName, password) in
self?.twitterAPI?.getUserTimelineWithScreenName(userName, count: 100, successBlock: {[weak self] (value: [AnyObject]!) in
// success
}) { (error: NSError!) in
// error
}
}) { (error: NSError!) in
// error
}

जवाब के लिए 0 № 4

यह वास्तव में एक भ्रामक त्रुटि संदेश है। समस्या यह है कि आंतरिक चर वैकल्पिक विकल्प नहीं हो सकता है, इसलिए आपको इसकी आवश्यकता है if/let यह।

खेल के मैदान में इसे देखें ...

class Foo:NSObject {
func doThing(bug:Int,completion:((Void)->(Void))) {

}
}

let woot = Foo()
var bar:Foo? = Foo()

bar?.doThing(7, completion: {});

woot.doThing(3, completion: {

bar?.doThing(4, completion:{});

});

यह संकलन और संदेश संकलित नहीं करता है

अभिव्यक्ति प्रकार को परिवर्तित नहीं कर सकता "(IntegerLiteralConvertible, पूरा करना: () -> () - $ टी 3) "टाइप करने के लिए" () "

समस्या के लिए बिल्कुल रोशनी नहीं है।

तो आप वैकल्पिक खोलना

woot.doThing(3, completion: {

if let bar = bar {
bar.doThing(4, completion:{});
}

});

और अब यह संकलित करता है।

और दूसरे मुद्दे पर

यदि आप जांचते हैं STTwitterAPI.h हैडर

- (NSObject<STTwitterRequestProtocol> *)getUserTimelineWithScreenName:(NSString *)screenName
successBlock:(void(^)(NSArray *statuses))successBlock
errorBlock:(void(^)(NSError *error))errorBlock;

इस के पूर्ण हस्ताक्षर के लिए सिर्फ एक सुविधा है।

- (NSObject<STTwitterRequestProtocol> *)getUserTimelineWithScreenName:(NSString *)screenName
sinceID:(NSString *)sinceID
maxID:(NSString *)maxID
count:(NSUInteger)count
successBlock:(void(^)(NSArray *statuses))successBlock
errorBlock:(void(^)(NSError *error))errorBlock;

ओब्जे-सी स्विफ्ट ब्रिजिंग ब्रैकेट के अंदर पहले चयनकर्ता खंड के बाद सबकुछ रखता है ताकि सुविधा विधियां कोड को पूरा करने से चीजों को भ्रमित कर सकें लेकिन कैननिकल केस प्रदान न करें।

तो आपके मामले में (मेरे बिना STTwitter) आप यही चाहते हैं।

twitterAPI?.verifyCredentialsWithUserSuccessBlock({ (userName, password) -> Void in

if let twitterAPI = self.twitterAPI {
twitterAPI.getUserTimelineWithScreenName("JohnSmith",sinceID:someID,maxID:anotherID,count:1000, successBlock: { (objects)[AnyObject]!) -> Void in

}, errorBlock: { (error: NSError!) -> Void in

})
}


}, errorBlock: { (error :NSError!) -> Void in


})

आप कैसे पॉप्युलेट करना चुनते हैं sinceID , maxID तथा count आप पर निर्भर है । मैंने कभी भी एपीआई का उपयोग नहीं किया है इसलिए "अनुमान लगाया नहीं। वे शून्य "सक्षम हो सकता है


संबंधित सवाल
सबसे लोकप्रिय