Комментарии 15
Спасибо за статью. С копированием была похожая проблема, предложенный в статье вариант через Self тоже рассматривался. Но он не будет работать, если создавать дочерние классы от CopyableClass и их тоже пытаться делать Copyble. Поэтому у себя делали подобную штуку: gist.github.com/dydus0x14/6fbfabcbf077e7d84ff04ca98b5cd791. Может кому пригодится
+1
В вашем решении вижу
но не вижу нигде typealias для него, разве что
associatedtype V
но не вижу нигде typealias для него, разве что
typealias T = One
0
Да, там надо T заменить на V. Спасибо, поправил:)
0
override func copy() -> Two {
let instance = Two()
return setup(instance)
}
И вот тут судя по всему должно быть:
override func copy() -> One {
let instance = Two()
return setup(instance)
}
0
Здесь как раз все гут. При вызове Two().copy() вернется объект ожидаемого типа Two.
0
Интересно. А если так?
func test() -> One {
let value: One = Two()
return value.copy() //у копии будет тип One или Two?
}
0
Логично, что у объекта в памяти будет тип Two, а ссылка, указывающая на этот объект и возвращаемая из функции/метода, — One.
Это все к тому, что большого смысла нет использовать associatedtype/Self/дженерики, если в какой-то момент идет приведение типов от базовых к частным посредством as! или подобных. Тогда можно просто везде в сигнатуре писать Object и приводить ручками :)
Это все к тому, что большого смысла нет использовать associatedtype/Self/дженерики, если в какой-то момент идет приведение типов от базовых к частным посредством as! или подобных. Тогда можно просто везде в сигнатуре писать Object и приводить ручками :)
0
По поводу наследования верное замечание. Я тоже сталкивался с проблемой копирования для иерархии классов.
Решение описанное выше можно модернизировать для саб-класса:
Решение описанное выше можно модернизировать для саб-класса:
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)
}
}
0
На Котлин то как похоже!
-2
Тут все просто: сохраняем ссылку на последний observer
В вашем случае сохранить можно не только ссылку, но и значение struct или enum.
Для избавления от логического противоречия надо к объявлению протокола дописать суффикс : class, тогда реализовать данный протокол смогут только классы, значение которых хранится и передаётся по ссылке. Такой протокол называется class oriented protocol
0
Указывать в примерах видимость объектов и методов, всё-таки, излишне — визуально и смыслово слово public в данном контексте никакой ценности не несёт, скорее даже мешает.
0
Интересно, очень хочется теперь продолжения
0
Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.
Swift Features