Swift 4 KeyPath 在不同类型的对象上



我有 2 种类型,AB实现相同的方法并具有相同的属性。我已经定义了一个扩展,用于在子属性中获取AB中每个的值。我想知道是否有办法将这 2 个扩展减少到 1 个方法。想象一下,还有更多的类型,如AB,所以代码重复问题变得更糟。

更新:AB与许多其他类似的内容一起生成。最初的计划是完全避免为AB编写扩展。我不知道这是否可能,但我被告知我可以为此使用 KeyPaths。属性名称必须不同。这是代码生成的副产品

struct A {
var something: Common
}
struct B {
var somethingElse: Common
}
struct Common {
var value1: String
var value2: String
}
extension A {
func valueFor(condition: Bool) -> String {
return condition ? self.something.value1 : self.something.value2
}
}
extension B {
func valueFor(condition: Bool) -> String {
return condition ? self.somethingElse.value1 : self.somethingElse.value2
}
}

我认为协议是解决您问题的方法。它们有助于使代码更加通用。

protocol CommonContaining {
var common: Common { get set }
func valueFor(condition: Bool) -> String {
return condition ? self.common.value1 : self.common.value2
}
}

struct A {
var something: Common
}
struct B {
var somethingElse: Common
}

extension A: CommonContaining {
var common: Common {
return something
}
}
extension B: CommonContaining {
var common: Common {
return somethingElse
}
}

据我了解,如果该方法与 Common 结构相关,那么您应该在结构本身中实现此方法或创建对结构的扩展:

struct A
{
var something: Common
}
struct B
{
var somethingElse: Common
}
struct Common
{
var value1: String
var value2: String
func valueFor(condition: Bool) -> String {
return condition ? self.value1 : self.value2 }
}
var object_1 = A(something: Common(value1: "1", value2: "1"))
var object_2 = B(somethingElse: Common(value1: "1", value2: "2"))
print(object_1.something.valueFor(condition: true))
print(object_2.somethingElse.valueFor(condition: false)) 

祝你好运。

相关内容

  • 没有找到相关文章

最新更新