https://github.com/Swinject/Swinject

一般的なDIコンテナの話がしたいのですが、何か具体的な例があったほうがよいと思い、上記のDIコンテナを例に書きます。

READMEにある通り、下記で I'm playing with Mimi. と出力できます。

protocol Animal {
    var name: String? { get }
}

class Cat: Animal {
    let name: String?

    init(name: String?) {
        self.name = name
    }
}

protocol Person {
    func play()
}

class PetOwner: Person {
    let pet: Animal

    init(pet: Animal) {
        self.pet = pet
    }

    func play() {
        let name = pet.name ?? "someone"
        print("I'm playing with \(name).")
    }
}


let container = Container()
container.register(Animal.self) { _ in Cat(name: "Mimi") }
container.register(Person.self) { r in
    PetOwner(pet: r.resolve(Animal.self)!)
}

let person = container.resolve(Person.self)!
person.play() // prints "I'm playing with Mimi."

上記は

let person = PetOwner(pet: Cat(name: "Mimi"))
person.play()

と同じことをやっているに過ぎません。(やはりあなた方のDependency Injectionはまちがっている。によるとこれで立派なDIパターンとなります。)

さて、では別のPetOwnerのインスタンスと別のCatのインスタンスを紐付けるにはどうすればよいのでしょうか?

やりたいコード例としては下記です(下記をDIコンテナでやるにはどうするのか?)。
そもそも一般的なDIコンテナはこのような使用は想定されていないのでしょうか??

let owner1 = PetOwner(pet: Cat(name: "Mimi"))
let owner2 = PetOwner(pet: Cat(name: "Kiki"))

owner1.play()
owner2.play()