编译错误“实例方法‘someMethod’中函数类型的可发送性与协议‘SomeProtocol’中的要求不匹配”iOS 16 Swift 5.7

Nik*_*iev 2 ios swift ios16 swift5.7

更新到 Xcode 14、iOS 16、Swift 5.7 后,编译项目时我得到:

Sendability of function types in instance method 'addObserver(forName:object:queue:using:)' does not match requirement in protocol 'NotificationCenterProtocol'
Run Code Online (Sandbox Code Playgroud)

Nik*_*iev 6

长话短说:博士

如果您有自定义协议并且要使现有类符合它,请确保方法签名完全匹配,在本例中添加@Sendable到闭包(在 后面@escaping)。



当您创建协议然后使现有类符合它(在本例中为 native NotificationCenter)时,可能会发生这种情况。您必须获取协议中方法的签名,使其与类中现有的签名完全匹配。

随着最新的更新,@Sendable引入并需要添加到您的自定义协议中,因此例如对于NotificationCenter此功能需要说:[...] using block: @escaping @Sendable (Notification) -> Void

提示:查看确切函数签名的最简单方法是通过“开发人员文档”(“帮助”菜单下),因为在那里您可以看到 Swift 语法。如果您要“Cmd + 单击” NotificationCenter,您会看到这些方法,但使用的是 Objective-C 语法。