Сделать концепцию инжекций зависимостей понятной. Давайте возьмем пример кнопки переключателя для переключения (включения / выключения) лампочки.
Переключателю необходимо заранее знать, к какой лампе подключаюсь (жестко закодированная зависимость ). Таким образом, переключатель
Switch -> PermanentBulb // напрямую подключен к постоянной лампе, тестирование невозможно легко
Switch(){
PermanentBulb = new Bulb();
PermanentBulb.Toggle();
}
Коммутатор знает, что мне нужно включать / выключать любую лампу, переданную мне. Таким образом,
Switch -> Bulb1 OR Bulb2 OR NightBulb (инжектированная зависимость)
Switch(AnyBulb){ //pass it whichever bulb you like
AnyBulb.Toggle();
}
Изменение Джеймс Пример для переключателя и лампы:
public class SwitchTest {
TestToggleBulb() {
MockBulb mockbulb = new MockBulb();
// MockBulb is a subclass of Bulb, so we can
// "inject" it here:
Switch switch = new Switch(mockBulb);
switch.ToggleBulb();
mockBulb.AssertToggleWasCalled();
}
}
public class Switch {
private Bulb myBulb;
public Switch() {
myBulb = new Bulb();
}
public Switch(Bulb useThisBulbInstead) {
myBulb = useThisBulbInstead;
}
public void ToggleBulb() {
...
myBulb.Toggle();
...
}
}`
Используйте структуру и добавьте пользовательский оператор равенства
struct Item : Equatable {
let image : UIImage
let value : Int
static func ==(lhs: Item, rhs: Item) -> Bool {
return lhs.value == rhs.value
}
}
Затем создайте экземпляры Item
, присваивающие изображения и соответствующие значения
let item1 = Item(image : UIImage(named: "PigAnimal")!, value: 1)
let item2 = Item(image : UIImage(named: "PigWord")!, value: 1)
и сравните
[ 112]