从swift协议存储/传递函数类型

前端之家收集整理的这篇文章主要介绍了从swift协议存储/传递函数类型前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
这段代码崩溃了swift(3,3.1,4)编译器:
protocol Test {
    func f()
}
let x = Test.f // crash

我希望,也许是天真的,编译器会将x推断为带有签名的函数类型(Test) – > (虚空) – >无效,以后,我可以这样称呼它:

let y = SomeClassConformingToTest()
x(y)()

我想我的问题是:显然编译器应该做除崩溃之外的事情,但Swift目前是否支持这种语法?

如你所说,编译器永远不会崩溃;这确实是一个错误,has been filed here.其中,Swift团队成员Slava Pestov说:

We plan on making MyProtocol.someInstanceMethod work. You can already
do this for classes,eg,

06000

It should have the same behavior for protocols:

06001

I plan on addressing this later.

截至2017年5月8日,错误报告现已标记为“进行中”,因此希望这将成为Swift 4.0的发布版本.

但是,在实现/修复之前 – 一个简单的解决方法就是使用闭包表达式,以便充当部分应用方法的thunk,并使用实例调用它:

protocol Test {
    func f()
}

struct S : Test {
    func f() {
        print("hello")
    }
}

let x: (Test) -> () -> Void = { $0.f }

let s = S()
x(s)() // "hello"

当然,如果你不需要中间部分应用功能,你可以说:

let x: (Test) -> Void = { $0.f() }

let s = S()
x(s) // "hello"
原文链接:https://www.f2er.com/swift/320093.html

猜你在找的Swift相关文章