Как стать автором
Обновить

Комментарии 15

Спасибо за статью. С копированием была похожая проблема, предложенный в статье вариант через Self тоже рассматривался. Но он не будет работать, если создавать дочерние классы от CopyableClass и их тоже пытаться делать Copyble. Поэтому у себя делали подобную штуку: gist.github.com/dydus0x14/6fbfabcbf077e7d84ff04ca98b5cd791. Может кому пригодится
В вашем решении вижу

associatedtype V


но не вижу нигде typealias для него, разве что

typealias T = One
Да, там надо T заменить на V. Спасибо, поправил:)
override func copy() -> Two {
     let instance = Two()
     return setup(instance)
}


И вот тут судя по всему должно быть:

override func copy() -> One {
     let instance = Two()
     return setup(instance)
}
Здесь как раз все гут. При вызове Two().copy() вернется объект ожидаемого типа Two.
Интересно. А если так?

func test() -> One {
   let value: One = Two()
   return value.copy() //у копии будет тип One или Two?
}
Логично, что у объекта в памяти будет тип Two, а ссылка, указывающая на этот объект и возвращаемая из функции/метода, — One.
Это все к тому, что большого смысла нет использовать associatedtype/Self/дженерики, если в какой-то момент идет приведение типов от базовых к частным посредством as! или подобных. Тогда можно просто везде в сигнатуре писать Object и приводить ручками :)
Спасибо. Интересный метод. Возьму на вооружение :)
По поводу наследования верное замечание. Я тоже сталкивался с проблемой копирования для иерархии классов.
Решение описанное выше можно модернизировать для саб-класса:

public class CopyableSubclass: CopyableClass {
    public var fieldC = [Int]()
    
    public override func copy() -> Self {
        let copy = super.copy() as! CopyableSubclass
        
        copy.fieldC = fieldC
        
       //та самая функция из статьи для каста к Self
        return unsafeCast(copy)
    }
}
На Котлин то как похоже!
Тут все просто: сохраняем ссылку на последний observer

В вашем случае сохранить можно не только ссылку, но и значение struct или enum.
Для избавления от логического противоречия надо к объявлению протокола дописать суффикс : class, тогда реализовать данный протокол смогут только классы, значение которых хранится и передаётся по ссылке. Такой протокол называется class oriented protocol
В вашем случае сохранить можно не только ссылку, но и значение struct или enum.

Да, разумеется. Но я не стал усложнять код конструкциями вроде class.
Указывать в примерах видимость объектов и методов, всё-таки, излишне — визуально и смыслово слово public в данном контексте никакой ценности не несёт, скорее даже мешает.
Убрал лишние public
Интересно, очень хочется теперь продолжения
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории