Создать экземпляр из класса, используя другой экземпляр класса - PullRequest
0 голосов
/ 21 февраля 2019

Итак, я натолкнулся на это дело, уже опубликованное приложение должно было изменить все его API и модели .


Теперь я создал общий уровень для обработки запросов и API и почти на полпути к реализации всех сервисов. Теперь я столкнулся с этой проблемой, предыдущие определенные модели широко используются в приложенияхконечно и так как MVC, Massive View Controller .это будет стоить мне слишком много, меняя все в каждой сцене на новый тип модели,
, поэтому я подумал о создании адаптера для приведения новых моделей, когда я получу их в своем закрытии обратного вызова к старому типу.


Я уже нашел способ, но проблема довольно длинная, долгий путь, я ищу лучший подход, если таковой существует, и лучшее решение для всего случая, если есть лучший.,


protocol Parsable {
    var time: String { get }
    var span: String { get }
    init(_ copy: Parsable)
}

class Foo: Parsable {
    required init(_ copy: Parsable) {
        self.span =  copy.span
        self.time =  copy.time
    }

    init(time: String, span: String) {
        self.time = time
        self.span = span
    }
    var time = ""
    var span = ""
}

class Fee: Parsable {
    required init(_ copy: Parsable) {
        self.span =  copy.span
        self.time = copy.time
    }
    init(time: String, span: String, date: String) {
        self.time = time
        self.span = span
        self.date = date // an extra var that is not used in Foo
    }
    var time = ""
    var span = ""
    var date = ""
}

var foo = Foo(time: "", span: "")
var fee = Fee(time: "2", span: "ye", date: "123")
// Usage
var deeped = Foo(fee)

Как вы можете сказать из кода, я создал protocol, который содержит переменные, и init(), который содержит его тип, теперь представьте это для реализациимодели с переменной + 50 и модели + 40 , возможно, потребуется возраст или два.

Ответы [ 2 ]

0 голосов
/ 04 марта 2019

Итак, я достиг этого, используя Codable, я создал фиктивный протокол, соответствующий Codable, и использовал его в каждом class, struct, который мне был необходим для его преобразования, и создал универсальную функциюрасширенный от этого протокола, чтобы закодировать объект в данные, а затем декодировать его в новый требуемый тип,

При этом мне не нужно объявлять переменную или свойство, которые мне нужно было скопировать вручную.

проверьте код ниже.

protocol Convertable: Codable {}

class Foo: Convertable {
    var foo: String
    var fee: String
    init(foo: String, fee: String) {
        self.foo = foo
        self.fee = fee
    }
}
class Fee: Convertable{
    var fee: String
     init( fee: String) {
        self.fee = fee
    }
}

//Generic function to convert
extension Convertable {
    func convert<T: Codable>(_ primary: T.Type) -> T? {
        return try? JSONDecoder().decode(primary, from: try! JSONEncoder().encode(self))
    }
}
var foo = Foo(foo: "nothing", fee: "nothing")
let fee = foo.convert(Fee.self)
fee?.fee // nothing
0 голосов
/ 21 февраля 2019

Надеюсь, я понял проблему, это не чистое решение, но быстрое и гибкое:

Как насчет дополнительного метода в протоколе с реализацией в его расширении для выполнения всех копий?Это возможно, поскольку я вижу, что всем свойствам присвоено фиктивное значение.Тогда единственное, что нужно сделать для каждого объекта, реализующего Parsable, - вызвать такой метод в инициализаторе.тип метода commonInit().

protocol Parsable {
    var time: String { get }
    var span: String { get }
    init(_ copy: Parsable)
    func initParsableProperties(from copy: Parsable)
}

extension Parsable {
    func initParsableProperties(from copy: Parsable) {
        self.span =  copy.span
        self.time = copy.time
    }
}

class Foo: Parsable {
    ...
    required init(_ copy: Parsable) {
        initParsableProperties(from: copy)
    }
    ...

}

Это также позволяет добавлять дополнительные свойства в инициализаторы, если это необходимо.Если вам не нужны дополнительные свойства, они могут быть напрямую реализованы в инициализаторе, но для этого требуются более сложные решения.

...