当前位置: 首页 > 面试题库 >

通过快速协议存储/传递功能类型

穆乐逸
2023-03-14
问题内容

以下代码使快速(3,3.1,4)编译器崩溃:

protocol Test {
    func f()
}
let x = Test.f // crash

我可能天真地希望编译器将其推断x为具有签名的Function Type (Test) -> (Void) -> Void,之后,我可以这样称呼它:

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

我想我的问题是:显然,编译器应该执行除崩溃以外的其他操作,但是Swift目前应该支持这种语法吗?


问题答案:

如您所说,编译器永远不会崩溃;这确实是一个错误,已在此处提交。Swift团队成员Slava
Pestov在其中说:

我们计划使MyProtocol.someInstanceMethod工作。您已经可以在课程中执行此操作,例如,

class Foo {
    func f() { ... }
}
let f: Foo -> () -> () = Foo.f

它对于协议应该具有相同的行为:

protocol Foo {
    func f()
}
let f: Foo -> () -> () = Foo.f

我计划稍后再解决。

到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"


 类似资料:
  • 问题内容: 我真的是Swift的新手,我刚刚读到类是通过引用传递的,并且复制了数组/字符串等。 通过引用进行传递是否与在Objective-C或Java中通过“ a”引用进行传递的方式相同,还是通过引用进行正确传递? 问题答案: Swift中的事物类型 规则是: 类实例是 引用类型 (即, 您 对类实例的引用实际上是一个 指针 ) 函数是参考类型 其他一切都是 价值类型 ; “其他所有内容”仅表示

  • 问题内容: 我正在为Swift 编写本教程:https : //www.raywenderlich.com/125311/make- game-like-candy-crush-spritekit-swift- part-1 并遇到以下代码: 我正是这样写的,但是Xcode给了我这些错误: 我从苹果的文档中找到了以下代码:https : //developer.apple.com/document

  • 问题内容: 我需要使一个类符合Swift中的协议,以实现委托。我该怎么办? 问题答案: 但是请注意,某些协议 要求 您实现委托方法。例如, 要求 您实施 和 如果那些不是由符合协议的类实现的,则Xcode会给您一个编译错误(始终检查协议声明,Cmd + Click将向您显示 必须 实现的方法)。

  • 问题内容: 我有一个符合多种协议的Objective-C变量。 我将如何在Swift中代表这种类型? 问题答案: 这应该工作: 注意,必须快速使用NSObjectProtocol而不是NSObject。 以下是一些其他示例: 符合多种协议的对象数组: 具有符合多种协议的参数的功能: 对于3.1之前的Swift版本,请使用:

  • 问题内容: 我想在IB中建立一个自定义的swift委托。委托是一个快速实现特定协议的对象。 不幸的是,编译器抱怨: 问题答案: 您必须将协议声明为: 这是因为将变量声明为,仅适用于对象。我不确定为什么不能只说协议符合,这也许是Swift的错误。

  • 所以这里我有通过本地存储令牌的登录功能。我在开发工具/应用程序中创建用户时获得令牌,它将我重定向到正在工作的家庭。不起作用的是这个。创建一个用户,它正在工作,但当它加载时,它应该显示logout而不是login,并且应该隐藏购物车组件。我在哪里犯了一个错误上下文Api 登录链接 标题 登录组件