与struct

时间:2015-05-31 18:03:22

标签: xcode swift generics

由于Swift中typealias定义缺乏通用支持,我写了一个通用的ResultHandler<T>回调,如下所示:

struct ResultHandler<T> {
    let f: (result: T) -> ()
}

这适用于使用Void以外的任何其他内容的处理程序:

Dispatch<Bool>.dispatch({ () -> (Result<Bool>) in
    Result<Bool>(true)
}).onResult(ResultHandler() { (result: Bool) in
    if result {
        self.doSomething() // Method executes successfully
    }
})

但是在尝试使用Void

Dispatch<Void>.dispatch({ () -> (Result<Void>) in
    Result<Void>()
}).onResult(ResultHandler() { (result: Void) in // Compiler error here
    self.doSomething()
})

存在编译错误:

  

功能签名&#39;(虚空) - &gt; ()&#39;与预期类型不兼容   &#39;(结果:无效) - &gt; ()&#39;

似乎误导/编译器错误,好像我更改了签名以使用错误输入的值:

Dispatch<Void>.dispatch({ () -> (Result<Void>) in
    Result<Void>()
}).onResult(ResultHandler() { (result: Void?) in // Compiler error here
    self.doSomething()
})

错误消息会选择指示?的可选项,但仍无法正确检测到我的result:标签:

  

功能签名&#39;(空?) - &gt; ()&#39;与预期类型不兼容   &#39;(结果:无效) - &gt; ()&#39;

我做错了什么?

1 个答案:

答案 0 :(得分:1)

您不需要在闭包类型声明中指定参数名称 - 这是导致编译器出现问题的原因:

struct ResultHandler<T> {
    let f: T -> ()
}

现在,您可以创建使用ResultHandler参数,Bool参数的Void个实例,或完全省略参数:

let r1 = ResultHandler() { (result: Bool) in
    if result {
        // do something
    }
}

let r2 = ResultHandler() { (_: Void) in
    // do something
}

let r3 = ResultHandler() {
    // do something
}