我有以下代码:
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#>)
更新:现在,我收到一个构建错误,说错过了参数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 :(得分: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
返回。
从Xcode 6.2 / Swift 1.1开始,你需要在这里明确return
。
或者,使用已解决此问题的Xcode 6.3 / Swift 1.2。
请参阅此问题:One-line closure without return type或Swift - 'Bool' is not a subtype of 'Void'?
答案 1 :(得分: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
变量之前调用let。
答案 2 :(得分:1)
这是一个简单的例子。 但最好通过 monad 进行实施。
...
guard let api = twitterAPI else { return }
api.verifyCredentialsWithUserSuccessBlock({ userName, password in
api.getUserTimelineWithScreenName(
userName,
count: 100,
successBlock: { value in
// success
}) { error in
print("get user error: \(error)")
}
}) { error in
print("verify error: \(error)")
}
答案 3 :(得分: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, 完成:() - &gt;() - $ 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 to 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,因此不会猜测。他们可能是不可能的