В моем приложении iOS есть следующая структура:
struct MyStruct<T> {
var property1: T
var property2: T
init(property1: T, property2: T) {
self.property1 = property1
self.property2 = property2
}
init(allPropertiesWith value: T) {
self.property1 = value
self.property2 = value
}
}
У меня также есть 2 класса, у которых нет общего предка:
class A { }
class B { }
В моем приложении естьэкземпляры MyStruct<A>
, MyStruct<B>
, MyStruct<A?>
, MyStruct<B?>
, и я использую их в следующих функциях:
func f1(myStrurct: MyStruct<A?>) { }
func f2(myStrurct: MyStruct<A>) { }
func g2() {
f1(myStrurct: MyStruct<A?>(property2: A()))
}
/* I also have the same functions for MyStruct<B> and MyStruct<B?> */
Я не могу изменить f1
, f2
и g2
.Вот почему я создал 2 расширения, чтобы упростить инициализацию MyStruct<T>
:
extension MyStruct where T == A? {
init(property1: T) {
self.property1 = property1
self.property2 = nil
}
init(property2: T) {
self.property1 = nil
self.property2 = property2
}
}
extension MyStruct where T == B? {
init(property1: T) {
self.property1 = property1
self.property2 = nil
}
init(property2: T) {
self.property1 = nil
self.property2 = property2
}
}
Как видите, эти расширения почти одинаковы.Возможно ли его рефакторинг только с одним расширением?