Swift 可选关闭并检查是否为零
所以我想要的是一个类,它可以在一个函数中得到一个闭包,它也可能在某个时候想要忽略这个闭包。如何检查是否设置了闭包变量,以及在使用完闭包变量后如何删除它 无法调用“!=”具有类型为“(@lvalue)的参数列表(成功: Bool!,产品:[AnyObject]!)->()?,NilLiteralConvertible)“”类型 “(success:Bool!,products:[AnyObject]!)->()?”不符合 “Nilliteral”协议Swift 可选关闭并检查是否为零,swift,closures,block,Swift,Closures,Block,所以我想要的是一个类,它可以在一个函数中得到一个闭包,它也可能在某个时候想要忽略这个闭包。如何检查是否设置了闭包变量,以及在使用完闭包变量后如何删除它 无法调用“!=”具有类型为“(@lvalue)的参数列表(成功: Bool!,产品:[AnyObject]!)->()?,NilLiteralConvertible)“”类型 “(success:Bool!,products:[AnyObject]!)->()?”不符合 “Nilliteral”协议 class-someClass{ //type
class-someClass{
//typealias completionHandlerClosureType=(成功:Bool!,项:[AnyObject]!)->()
var completionHandler:(成功:Bool!,项:[AnyObject]!)->()?
var生命值=100
var someset=[“哦,不!”,“为我报仇!”]
init(){}
func getHitFunc(impact:Int,passedCompletionsHandler:(successs:Bool!,items:[AnyObject]!)->()){
completionHandler=passedCompletionsHandler
生命值=生命值-影响
}
func checkIfDead{
如果hitpoints您需要将闭包签名用括号括起来,使闭包本身成为可选的。按照现在编写的方式,闭包返回可选的Void(这没有真正意义)
示例代码的一些样式点和修订:
// Capitalize class names so it's clear what's a class
class SomeClass {
// "success" has two "c"s
var completionHandler: ((success:Bool!, items:[AnyObject]!)->())?
var hitpoints = 100
var someset = ["oh no!","avenge me!"]
init() { }
func getHitFunc(impact:Int, passedCompletionsHandler:(success:Bool!, items:[AnyObject]!)->()){
completionHandler = passedCompletionsHandler
hitpoints = hitpoints - impact
}
// You were missing the argument list here:
func checkIfDead() {
if hitpoints <= 0 {
// Rather than checking to see if the completion handler exists, you can
// just call it using optional syntax like this:
completionHandler?(success: true, items: someset)
}
completionHandler = nil
}
}
//将类名大写,以便清楚什么是类
上课{
//“成功”有两个c
var completionHandler:((成功:Bool!,项:[AnyObject]!)->())?
var生命值=100
var someset=[“哦,不!”,“为我报仇!”]
init(){}
func getHitFunc(impact:Int,passedCompletionsHandler:(success:Bool!,items:[AnyObject]!)->()){
completionHandler=passedCompletionsHandler
生命值=生命值-影响
}
//您缺少此处的参数列表:
func checkIfDead(){
如果命中率首先,在完成处理程序的声明中,需要使用括号将整个事件声明为可选:
var completionHandler: ((_ success: Bool, _ items: [Any]?) -> ())?
或者,也许更好,您可以将最后的()
替换为Void
:
var completionHandler: ((_ success: Bool, _ items: [Any]?) -> Void)?
另外,请注意,我不认为您想让Bool
成为可选的(因为如果存在闭包,您可能总是传递success
值true
或false
)。显然,项的数组可能是可选的
无论如何,完成后,您只需确保打开可选的:
func checkIfDead() {
if hitpoints <= 0 {
completionHandler?(true, items)
}
completionHandler = nil
}
那么这个属性就是:
var completionHandler: CompletionHandlerClosureType?
将此completionHandler
作为可选参数的函数可以执行以下操作:
func startSomeProcess(passedCompletionHandler: CompletionHandlerClosureType?) {
completionHandler = passedCompletionHandler
// do whatever else you want
}
然后,最终完成逻辑保持不变:
func finishSomeProcess() {
completionHandler?(true, items)
completionHandler = nil
}
(注意,以上内容已针对Swift 3进行了修改。如果您想查看Swift 2格式副本,请参阅本答案的第1部分。)类型别名是一个很好的解决方案。这在解释上非常好。仍然适用于Swift 4。Swift中的完成块比objective-C有了很大的改进,但仍然需要付出一些努力才能正确完成,特别是当我移植过去几个objective-C类时,有人在本项目中深思熟虑地忽略了这些类T
var completionHandler: CompletionHandlerClosureType?
func startSomeProcess(passedCompletionHandler: CompletionHandlerClosureType?) {
completionHandler = passedCompletionHandler
// do whatever else you want
}
func finishSomeProcess() {
completionHandler?(true, items)
completionHandler = nil
}