2015-04-07 5 views
16

मैं निम्नलिखित कोड है:स्विफ्ट बंद के अंदर बंद कॉलिंग

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") 
     }) 

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

enter image description here

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

अपडेट: फिर भी त्रुटियों का निर्माण होने:

enter image description here

अद्यतन: यदि मैं बंद के बाहर 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#>) 

enter image description here

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

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 

      }) 

     } 
+0

उपयोग 'self.twitterAPI? .getUserTimeline .......' – danielbeard

+0

मैं भी समस्याएं आ रही हूँ! कृपया अद्यतन स्क्रीनशॉट की जांच करें। –

+0

स्वयं का उपयोग करते समय समस्या केवल बंद होने के अंदर आती है। अगर मैं getUserTime डालता हूं .. पैरेंट क्लोजर के बाहर विधि तो यह काम करता है। –

उत्तर

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 चर का उपयोग कर पहले आपको उसकी कॉल: अगर ऐसी बात है, तो आप कुछ इस तरह चाहता हूँ।

+0

धन्यवाद! मैंने आपके जैसे कोड को अपडेट किया लेकिन अब सेआईआईडी से संबंधित त्रुटि प्राप्त हो रही है। लेकिन मैं उस कन्स्ट्रक्टर का भी उपयोग नहीं कर रहा हूं। मूल प्रश्न में कोड अपडेट किया गया। –

+0

मेरा उत्तर अपडेट किया गया – danielbeard

+0

हां, मैं एसटीटीविटर लाइब्रेरी का उपयोग कर रहा हूं। मैंने आपके कोड को चिपकाया है और निम्न त्रुटि मिली है "कॉल में पैरामीटर के लिए पैरामीटर के लिए गुम तर्क"। –

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 का उपयोग करें जिसने इस समस्या को ठीक किया है। One-line closure without return type या Swift - 'Bool' is not a subtype of 'Void'?

0

यह एक सच में भ्रामक त्रुटि संदेश है:

इस प्रश्न देखें। समस्या यह है कि आंतरिक चर वैकल्पिक प्रकार का नहीं हो सकता है, इसलिए आपको 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, पूरा होने:() ->() - $ T3)' कनवर्ट नहीं कर सकता टाइप करने के लिए '()'

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

तो तुम वैकल्पिक

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; 

Obj सी।

तो आपके मामले में (बिना 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 आप पर निर्भर है चुनें। मैंने एपीआई का कभी भी उपयोग नहीं किया है, इसलिए अनुमान नहीं लगाया जाएगा। वे उदाहरण के लिए

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 
} 
संबंधित मुद्दे