Заклик до швидкого закриття всередині закриття - іос, швидкий

У мене є такий код:

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

Я отримую такі помилки:

введіть опис зображення тут

Я намагався сказати себе всередині зовнішнього закриття, але це не спрацювало. Що мені не вистачає?

ОНОВЛЕНО: все ще виникають помилки складання:

введіть опис зображення тут

UPDATE: Якщо я поставив метод 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


})

UPDATE: Визначення методу getUserTimeLine

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

введіть опис зображення тут

UPDATE: Тепер я отримую помилку збірки про відсутність аргументу з ID. Я навіть не використовую цей конструктор.

 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

})

}

Відповіді:

4 для відповіді № 1

Спробуйте:

        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 повернутися

Починаючи з Xcode 6.2 / Swift 1.1, вам потрібні явні return тут

Або скористайтеся Xcode 6.3 / Swift 1.2, яка вирішила цю проблему.

Подивіться на це питання: Замикання однієї лінії без зворотного типу або Swift - "Bool" не є підтипом "Void"?


1 для відповіді № 2

Гаразд, за іменами методів, які ви використовуєте, я гадаю, що ви використовуєте 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 змінна


1 для відповіді № 3

наприклад, проста версія. Але краще зробити монаду

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, завершення: () -> () - $ 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-C до Swift об'єднує всі місця після першого елемента вибору всередині дужок, тому методи зручності, як правило, плутають речі за допомогою заповнення коду, але не забезпечують канонічний випадок.

Так у вашому випадку (без мене 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 на ваш розсуд . Я ніколи не використовував API, щоб не здогадався. Вони можуть бути нічим здатними


Схожі запитання
Найбільш популярний