«Не пустая функция должна возвращать значение» при захвате Self в защитном операторе Swift 4.2 при закрытии в функции - PullRequest
0 голосов
/ 03 декабря 2018

Как мы можем использовать стиль Swift 4.2 для захвата себя в замыканиях в функциях, которые возвращают тип?

Например:

func checkEmailExists(_ email: String) -> Observable<Bool> {
    return Observable.create { [weak self] observer in
        guard let self = self else { return }
        self.callAPI()
    }
}

Это приводит к ошибке Non-void function should return a value, но такжеон не должен return false, так как это повлияет на результат вызова функции.

РЕДАКТИРОВАТЬ: Другой пример, бросает Non-void function should return a value

func loginWithCredentials() -> Observable<User> {
    return Observable.create { [weak self] observer in
        guard let self = self else { return }

        let decoder = JSONDecoder()
        let json = ["id": 1, "name": "John Doe", "email": "john@doe.com"] as [String: Any]

        do {
            let user = try decoder.decode(User.self, from: json.jsonData()!)
            observer.onNext(user) // Simulation of successful user authentication.
        } catch {
            print("error")
        }

        return Disposables.create()
    }
}

Ответы [ 2 ]

0 голосов
/ 03 декабря 2018

Вы должны вернуть одноразовые вещи в любом случае.

func checkEmailExists(_ email: String) -> Observable<Bool> {
    return Observable.create { [weak self] observer in
        guard let self = self else { return Disposables.create() }
        // and so on...
        return Disposables.create { /* cancelation code */ }
    }
}

Это кажется очень неправильным.Ваша функция callAPI() должна сама по себе возвращать какое-либо наблюдаемое, что сделает эту функцию бессмысленной.

0 голосов
/ 03 декабря 2018

Попробуйте сделать тип возврата как необязательно и вернуть nil, если нет self

ИЛИ

Вы можете избежать этого guard утверждение путем вызова вашего метода со знаком ?, например:

self?.callAPI()
...