Связывание методов Swift, как повторно использовать классы и методы?

Рассмотрим следующий пример

class ClassA {
    
    func createAnInstanceOfAnotherClass() -> AnotherClass {

        return AnotherClass()
    }
    
    func callMeA() {
        
    }
}

class ClassB {
    func createAnInstanceOfAnotherClass() -> AnotherClass {

        return AnotherClass()
    }
    
    func callMeB() {
        
    }
}

class AnotherClass {
    func doSomethingAndReturn() {
        return
    }
}

class MethodChain {
    func methodChainTest() {
        ClassA()
            .createAnInstanceOfAnotherClass()
            .doSomethingAndReturn() //return to ClassA
            .callMeA() // call classA callMe
        
        ClassB()
            .createAnInstanceOfAnotherClass()
            .doSomethingAndReturn() // return to ClassB
            .callMeB() // call ClassB callMe
    }
}

Может ли класс AnotherClass вернуть экземпляр класса, который его создал? В этом примере я хочу использовать метод класса doSomethingAndReturn при объединении методов как с ClassA, так и с ClassB, а затем соединить цепочку методов с методами из ClassA или ClassB


person sago92    schedule 03.02.2021    source источник


Ответы (1)


Вы можете сделать AnotherClass универсальным с параметром типа Creator, в котором хранится тип его создателя.

class ClassA {
    
    func createAnInstanceOfAnotherClass() -> AnotherClass<ClassA> {

        return AnotherClass(creator: self)
    }
    
    func callMeA() {
        
    }
}

class ClassB {
    func createAnInstanceOfAnotherClass() -> AnotherClass<ClassB> {

        return AnotherClass(creator: self)
    }
    
    func callMeB() {
        
    }
}

class AnotherClass<Creator: AnyObject> {
    // weak to avoid retain cycles!
    private weak var creator: Creator?
    
    init(creator: Creator) {
        self.creator = creator
    }
    
    func doSomethingAndReturn() -> Creator {
        // assuming you always do method chaining, 
        // and not do something weird with the intermediate results,
        // this should be safe to unwrap forcefully
        creator!
    }
}
person Sweeper    schedule 03.02.2021
comment
Хорошее предложение, но вы рискуете создать цикл сохранения и возможную утечку памяти. Я бы посоветовал сделать свойство AnotherClass creator слабым, чтобы этого не произошло. - person Duncan C; 03.02.2021
comment
@DuncanC Спасибо за напоминание. Я не думал об этом! Я отредактировал свой ответ. - person Sweeper; 03.02.2021
comment
@Sweeper Должен ли создатель быть необязательным? есть ли причина не использовать частный слабый создатель var: Creator - person sago92; 03.02.2021
comment
@ sago92 weak vars должен быть необязательным. - person Sweeper; 04.02.2021
comment
@Sweeper кажется отличной идеей, спасибо! - person sago92; 04.02.2021