Ошибка компиляции в Property Wrapper в Swift 5.1 - PullRequest
0 голосов
/ 21 января 2020

Я выясняю свойства оберток в Swift, но мне, кажется, что-то не хватает.

Вот как я написал обертку свойств для используемой нами структуры внедрения зависимостей:

@propertyWrapper
struct Inject<Value> {
    var _value: Value

    var wrappedValue: Value {
        get {
            return _value
        }
        set {
            _value = newValue
        }
    }

    init(_ container: Container = AppContainer.shared) {
        do {
            _value = try container.resolve(Value.self)
        } catch let e {
            fatalError(e.localizedDescription)
        }
    }
}

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

class X: UIViewController {
    @Inject var config: AppConfiguration

    ....

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        config.johnDoSomething() // Compile error: 'AppConfiguration' is not convertible to 'AppConfiguration?'
    }
}

За несколько дней go я натолкнулся на ссылку, что Xcode имел проблемы с компиляцией Дженери c Собственность Обертки, но я больше не могу ее найти. Я не уверен, что это актуально, но, может быть, кто-то из SO может мне помочь.

Использование Xcode 11.3.1

В соответствии с просьбой, представьте (один файл на игровой площадке):

import UIKit

/// This class is only to mimick the behaviour of our Dependency Injection framework.
class AppContainer {
    static let shared = AppContainer()

    var index: [Any] = ["StackOverflow"]

    func resolve<T>(_ type: T.Type) -> T {
        return index.first(where: { $0 as? T != nil }) as! T
    }
}

/// Definition of the Property Wrapper.
@propertyWrapper
struct Inject<Value> {
    var _value: Value

    var wrappedValue: Value {
        get {
            return _value
        }
        set {
            _value = newValue
        }
    }

    init(_ container: AppContainer = AppContainer.shared) {
        _value = container.resolve(Value.self)
    }
}

/// A very minimal case where the compile error occurs.
class X {
    @Inject var text: String

    init() { }
}

1 Ответ

1 голос
/ 21 января 2020

Просто справляюсь с вашим "представлением":

Изменить

@Inject var text: String

на

@Inject() var text: String
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...