gpt4 book ai didi

ios - Binding Protocols with Associated Objects - 使用 Swift 进行面向协议(protocol)的编程

转载 作者:行者123 更新时间:2023-11-28 14:09:50 25 4
gpt4 key购买 nike

我是一名 iOS 开发人员,拥有几年的 swift 经验,但我很少使用 PAT...

这一次,我试图将一些代码从我开发的应用程序移动到我在几个项目中使用的共享库中。这个案例是关于一个工厂,它通过抽象构建器协议(protocol)使用各种构建器(我的业务资源的装饰器)来获取项目(在实际情况下,ViewControllers)。

Builder 依赖于 Factory 传递给他的一些变量,但这些变量处于应用程序级别,因此,要提取此逻辑并将其放入我的库中,我需要使用通用引用,因为我想以面向协议(protocol)的编程方式工作,它是一个 AssociatedType。

// The item that i want to receive from my factory
protocol Item {
var content: String { get }
}

// This is the Builder interface that the Factory consumes
protocol Builder {

// The Abstract Parameters that the Application should define
associatedtype Parameters

func build(_ parameters: Parameters) -> Item?
}

// The BusinessResource of my library
protocol BusinessResource { }

// The Factory that consumes the Builders
protocol Factory {

associatedtype FactoryBuilder: Builder

var parameters: FactoryBuilder.Parameters { get }

func make(from businessResource: BusinessResource) -> Item?
}

// The generic implementation of my Factory
extension Factory {

func make(from businessResource: BusinessResource) -> Item? {

guard let builder = businessResource as? FactoryBuilder else {
return nil
}
return builder.build(self.parameters)
}
}

此时一切看起来都很好。

我有两个协议(protocol),它们绑定(bind)在一起,共享一个通用的通用类型(构建器参数)。

所以,在应用层,现在我可以介绍我的具体参数(我将它们称为 ConcreteParameters XD)

// The concrete parameters of the Application Factory
struct ConcreteParameters {
let string: String
}

// The Builder interface restricting Parameters to ConcreteParameters
protocol BindedBuilder: Builder where Parameters == ConcreteParameters {

}

// The Factory interface restricting Parameters to ConcreteParameters
protocol BindedFactory: AbstractFactory where FactoryParameters: ConcreteParameters {

}

到目前为止,还不错。一切看起来都准备就绪,我开始认为这可行,所以现在我尝试在应用程序上实现一个具体的工厂,以尝试这是否真的可行。

// The concrete output of my Builder
struct ConcreteItem: Item {
var content: String
}

// The concrete BusinessResource that i get from my library
struct ConcreteObject: BusinessResource {

let string: String
}

// The decoration extension that makes ConcreteObject compliant with Builder
extension ConcreteObject: Builder {

typealias Parameters = ConcreteParameters

func build(_ parameters: ConcreteParameters) -> Item? {
return ConcreteItem(content: parameters.string + self.string)
}
}

// The real Factory inside my app
class ConcreteFactory: BindedFactory {

typealias FactoryBuilder = BindedBuilder

var parameters: ConcreteParameters {
return ConcreteParameters(string: "Hello ")
}
}

let item = ConcreteFactory().make(from: ConcreteObject(string: "world!"))
print(item ?? "NOT WORKING")

此时有些东西坏了......我得到这个错误:

Error: Type ConcreteFactory does not conform to AbstractFactory

[编辑:错误来自以前版本的代码片段,AbstractFactori 是当前工厂]

这是一个错误??我真的不知道如何解决这个...

最佳答案

我认为在这种情况下,您需要使用具体类型作为 FactoryBuilder 的别名,而不是 BindedBuilder,如 protocols do not conform to themselves .

这段代码可以有效地编译,是否符合您的要求?

class ConcreteFactory: BindedFactory {
typealias FactoryBuilder = ConcreteObject

var parameters: ConcreteParameters {
return ConcreteParameters(string: "Hello ")
}
}

否则,您也可以按照同一链接中的建议尝试类型删除 BindedBuilder 并创建 AnyBindedBuilder

关于ios - Binding Protocols with Associated Objects - 使用 Swift 进行面向协议(protocol)的编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52677061/

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