Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 可选关闭并检查是否为零_Swift_Closures_Block - Fatal编程技术网

Swift 可选关闭并检查是否为零

Swift 可选关闭并检查是否为零,swift,closures,block,Swift,Closures,Block,所以我想要的是一个类,它可以在一个函数中得到一个闭包,它也可能在某个时候想要忽略这个闭包。如何检查是否设置了闭包变量,以及在使用完闭包变量后如何删除它 无法调用“!=”具有类型为“(@lvalue)的参数列表(成功: Bool!,产品:[AnyObject]!)->()?,NilLiteralConvertible)“”类型 “(success:Bool!,products:[AnyObject]!)->()?”不符合 “Nilliteral”协议 class-someClass{ //type

所以我想要的是一个类,它可以在一个函数中得到一个闭包,它也可能在某个时候想要忽略这个闭包。如何检查是否设置了闭包变量,以及在使用完闭包变量后如何删除它

无法调用“!=”具有类型为“(@lvalue)的参数列表(成功: Bool!,产品:[AnyObject]!)->()?,NilLiteralConvertible)“”类型 “(success:Bool!,products:[AnyObject]!)->()?”不符合 “Nilliteral”协议

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
}