Как я могу написать простой пример использования делегатов в Swift 5? - PullRequest
1 голос
/ 24 января 2020

Я хочу написать простой пример того, как работают делегаты в Swift. Я установил класс, протокол и другой класс, который придерживается протокола. Однако я получаю в двух разных местах одну и ту же ошибку. Я создал простой инструмент командной строки swift в xcode, и весь мой код находится в main.swift. Код не имеет никакой реальной функциональности, кроме изучения работы делегатов.

Вот сообщения об ошибках:

Последовательные объявления в строке должны быть разделены ';'
Вставить ' ; '
Ожидается' ('в списке аргументов объявления функции
Ожидается' {'в теле объявления функции
Ожидаемое ключевое слово' fun c 'в объявлении метода экземпляра
Вставьте' fun c '
Ожидаемая декларация
Недопустимая переопределение делегата () // или что-либо () в другой ошибке

Вот код:

class MainClass {

    var delegate: MyProtocol? = nil

    delegate.doAnything() //getting 1st error here
}


protocol MyProtocol {
    func doAnything()
}


class OtherClass: MyProtocol {

    let anything = MainClass()

    anything?.delegate = self //getting 2nd error here

    func doAnything() {
        print("text")
    }
}

Ответы [ 2 ]

0 голосов
/ 24 января 2020

отредактируйте ваш код в файле детской площадки:

protocol MyProtocol {
    func doAnything()
}

class MainClass {

    var delegate: MyProtocol? = nil

    func callMeForGetCallBackWithDelegate() {
        // send call back inside any function after call or inside in init
        if let delegate = self.delegate {
            delegate.doAnything()
        }
    }
}


class OtherClass: MyProtocol {

    let anything = MainClass()

    init() {
        self.anything.delegate = self // set delegate in init or set inside any function
        self.anything.callMeForGetCallBackWithDelegate()
    }

    func doAnything() {
        print("text")
    }
}

let otherClass = OtherClass()
0 голосов
/ 24 января 2020

Итак, первая ошибка в том, что вы пытаетесь вызвать делегатскую функцию вне того места, где она может быть выполнена. Вам нужно создать функцию, которая вызывает эту функцию, или вызвать ее в init. При создании примеров попробуйте использовать концепции реального мира для моделирования вашего примера. Вы могли бы сделать что-то вроде класса проводника и класса поезда. Проводник может реализовать некоторый протокол управления, который контролирует скорость поезда.

В любом случае, ваша вторая ошибка в том, что self еще не инициализирован. чтобы присвоить переменную self, вы должны сначала инициализировать класс, чтобы вы могли сделать

init() {
   anything?.delegate = self
}

Не стесняйтесь DM, чтобы лучше понять эту концепцию, я выложу здесь полный пример чуть позже .

РЕДАКТИРОВАТЬ: ПОЛНЫЙ ПРИМЕР, не стесняйтесь задавать вопросы

import Foundation

enum Direction {
    case north
    case east
    case south
    case west
}

protocol VehicleControls {
    var speed: Float {get set}
    var direction: Direction {get set}
    var numPassengers: Int {get}

    func change(newSpeed: Float)

    func change(newDirection: Direction)

    func createNoise()
}

class Conductor {
    var vehicle: VehicleControls

    init() {
        vehicle = Train(s: 1.5, d: .west, nP: 50)
    }

    func controlVehicle() {
        vehicle.change(newSpeed: 2.5)
        vehicle.change(newDirection: .east)
        vehicle.createNoise()
        print("\n")
    }
}

class Train: VehicleControls {
    var speed: Float
    var direction: Direction
    var numPassengers: Int

    init() {
        self.speed = 0
        self.direction = .north
        self.numPassengers = 0
    }

    init(s: Float, d: Direction, nP: Int) {
        self.speed = s
        self.direction = d
        self.numPassengers = nP
    }

    func change(newSpeed: Float) {
        print("changing speed from \(speed), to \(newSpeed)")
        self.speed = newSpeed
    }

    func change(newDirection: Direction) {
        print("changing direction from \(direction) to \(newDirection)")
        self.direction = newDirection
    }

    func createNoise() {
        print("Chugga, Chugga... Chugga, Chugga... CHOO CHOO")
    }
}

class Car: VehicleControls {
    var speed: Float
    var direction: Direction
    var numPassengers: Int

    init() {
        self.speed = 0
        self.direction = .north
        self.numPassengers = 0
    }

    init(s: Float, d: Direction, nP: Int) {
        self.speed = s
        self.direction = d
        self.numPassengers = nP
    }

    func change(newSpeed: Float) {
        print("changing speed from \(speed), to \(newSpeed)")
        self.speed = newSpeed
    }

    func change(newDirection: Direction) {
        print("changing direction from \(direction) to \(newDirection)")
        self.direction = newDirection
    }

    func createNoise() {
        print("HONK HONK, BEEP BEEP")
    }
}

let newConductor = Conductor()

newConductor.controlVehicle()

newConductor.vehicle = Car(s: 60.56, d: .north, nP: 2)

newConductor.controlVehicle()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...