Swift 4 KeyPath для объектов разного типа - PullRequest
0 голосов
/ 21 сентября 2018

У меня есть 2 типа, A и B, которые реализуют одни и те же методы и имеют одинаковые свойства для них.Я определил расширение для извлечения значения в подчиненном свойстве для каждого из A и B.Я хочу знать, есть ли способ уменьшить эти 2 расширения до 1 метода.Представьте себе, что существует еще много типов, таких как A и B, поэтому проблема с дублированием кода становится намного хуже.

Обновление: A и B создаются вместе со многими другими, подобными им.Первоначальный план состоит в том, чтобы вообще не писать расширения для A или B.Я не знаю, возможно ли это, но мне сказали, что я могу использовать 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
    }
}

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

Из того, что я понял, если метод связан с общей структурой, вы должны реализовать этот метод в самой структуре или создать расширение для структуры:

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)) 

Удачи.

0 голосов
/ 21 сентября 2018

Я думаю, что протоколы - это решение вашей проблемы.Они помогают сделать код более общим.

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
    }
}
...