gpt4 book ai didi

swift - 将带有 where 子句的协议(protocol)作为协议(protocol)引用时不起作用

转载 作者:行者123 更新时间:2023-11-28 06:07:57 24 4
gpt4 key购买 nike

假设我有以下基础设施:

protocol Naming {
var printer: Printer { get }
var name: String { get }
}

extension Naming {
var name: String { return "\(type(of: self))" }

func printName() {
printer.print(name)
}
}

protocol Printer {
func print(_: String)
}

我有一个公开名称和打印机的协议(protocol),用于打印名称。

现在,为了遵循 MVC,我添加了这些:

protocol ModelInjectable {
associatedtype Model
var model: Model { get }
}

extension Naming where Self: ModelInjectable, Self.Model: Naming {
var printer: Printer { return model.printer }
var name: String { return model.name }
}

它允许 View Controller 指定它们允许模型,并且在这种情况下允许它们通过简单地将协议(protocol)一致性转发给模型来符合 Naming

这是一个简单的VC:

class MyViewController: UIViewController, ModelInjectable, Naming {
let model: MyModel

required init(model: MyModel) {
self.model = model
super.init(nibName: nil, bundle: nil)
}

required init?(coder: NSCoder) {
fatalError()
}
}

当我尝试为模型使用协议(protocol)时出现问题:

struct MyModel: Naming {
let printer: Printer
}

但是按预期工作

protocol MyModel: Naming {
}

给出编译错误:

error: type 'MyViewController' does not conform to protocol 'Naming' class MyViewController: NSViewController, ModelInjectable, Naming {

note: candidate has non-matching type 'Printer' var printer: Printer { return model.printer }

note: protocol requires property 'printer' with type 'Printer'; do you want to add a stub? var printer: Printer { get }

据我所知,编译器仅在使用具体类型时才使用 extension Naming where Self: ModelInjectable, Self.Model: Naming 扩展。使用协议(protocol)引用并不能解决问题。这是编译器的限制,还是我错误地使用了该功能?

最佳答案

不同于例如Objective-C 协议(protocol),Swift 协议(protocol)不符合自身。因此,protocol MyModel: Naming 不满足协议(protocol)扩展的 Self.Model: Naming 约束。

关于swift - 将带有 where 子句的协议(protocol)作为协议(protocol)引用时不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47669530/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com