首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Swift找不到由协议保证的方法

Swift找不到由协议保证的方法
EN

Stack Overflow用户
提问于 2016-06-25 13:05:40
回答 1查看 120关注 0票数 0

我试图想出一种方法来减少ViewController中使用Cleanse注入依赖的样板代码,然而,我的Cleanse.Component样板绝对停留在我的类型擦除类中。我做错了什么?

(为了便于阅读,包括代码和XCode快照)

代码语言:javascript
复制
import Foundation
import Cleanse

protocol CleanseInjectable {
    func inject(args: Any...) -> Void
    func prepare() -> Void
}

extension CleanseInjectable {
    func inject(args: Any...) -> Void {

    }
}

class AnyCleansePropertyInjectionComponent<TargetType: AnyObject, CleanseInjectable>: Cleanse.Component {
    typealias Root = PropertyInjector<TargetType>

    func configure<B : Binder>(binder binder: B) {
        binder
            .bindPropertyInjectionOf(TargetType.self)
            .to(injector: (TargetType.self as! CleanseInjectable.Type).inject)
    }
}

我得到的错误和任何Swift协议一样离奇--只有在事后才能明显看到的错误:Type 'CleanseInjectable' has no member 'inject'?!

EN

回答 1

Stack Overflow用户

发布于 2016-06-25 13:38:59

这个版本似乎修复了这个错误!看起来斯威夫特无法理解TargetType: AnyObject, CleanseInjectable在约束方面等同于protocol CleanseInjectable: class

代码语言:javascript
复制
import Cleanse

protocol CleanseInjectable: class {
    func inject(args: Any...) -> Void
    func prepare() -> Void
}

extension CleanseInjectable {
    func inject(args: Any...) -> Void {

    }
}

class AnyCleansePropertyInjectionComponent<TargetType: CleanseInjectable>: Cleanse.Component {
    typealias Root = PropertyInjector<TargetType>

    func configure<B : Binder>(binder binder: B) {
        binder
            .bindPropertyInjectionOf(TargetType.self)
            .to(injector: TargetType.inject)
    }
}

编辑:我的已完成的Cleanse样板清除器(未在运行时测试,将尽快更新),有趣和灵感!

代码语言:javascript
复制
import Cleanse

protocol CleanseInjectable: class {
    var cleanseComponent: AnyCleansePropertyInjectionComponent<Self>? { get }
    func inject(args: Any...) -> Void
    func prepare() -> Void
}

extension CleanseInjectable {
    func inject(args: Any...) -> Void {
        // Override me to do something useful, brah!
    }

    func prepare() -> Void {
        if (cleanseComponent != nil) {
            (try! cleanseComponent!.build()).injectProperties(into: self)
        }
    }
}

class AnyCleansePropertyInjectionComponent<TargetType: CleanseInjectable>: Cleanse.Component {
    typealias Root = PropertyInjector<TargetType>

    func configure<B : Binder>(binder binder: B) {
        binder
            .bindPropertyInjectionOf(TargetType.self)
            .to(injector: TargetType.inject)
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38025158

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档