【问题标题】:Swift: Call some method after object initialized in protocol extensionSwift:在协议扩展中初始化对象后调用某些方法
【发布时间】:2016-03-17 21:18:39
【问题描述】:

假设我有结构:

class A: UIViewController {

}

class C {
}

class B: A, P {
    typealias T = C
}

protocol P: class {
    typealias T
}

extension P {
    func initP() {
        print("test")
    }
}

是否可以在不修改 B 的情况下调用 initP?其他任何东西都可以修改。 我正在尝试创建类似通用抽象类的东西。系统(A,P)是基础。 (B, C) -- 具体实施。方法 initP 对于所有实现都是完全相同的。这就是为什么我试图避免在植入中调用它。另一方面,它使用 P 中的方法和类型。这就是为什么我不能简单地在 A 中调用它。 首先,我尝试使 A 通用,但在这种情况下,如果 B 作为情节提要中的场景类传递,则应用程序在运行时崩溃

【问题讨论】:

  • 如给定的那样,您的第一个代码块不会编译,因为initialize 是一个类函数,initP 是一个实例函数,因此initialize 不能调用initP跨度>
  • 同意。这是艰难的一天,我错过了它是静态的。但是,是否可以在给定限制的情况下从第二个块调用 initP?
  • 我已修改问题以显示我的真正问题。
  • 我不确定你想打电话给initP
  • 当类 B 被实例化时。实际上,如果在 viewDidLoad 或任何其他 UiViewController 生命周期方法上调用它是可以接受的。

标签: swift oop swift2 swift-protocols


【解决方案1】:

为什么这对你不起作用:

extension P {
    init() { // Or initWithCoder since it's a ViewController?
        print("test")
        self.init()
    }
}

【讨论】:

  • 我只能在明天试试这个。但问题是 P 不知道,它将应用于 UIViewController 的子类
【解决方案2】:

由于您已使用协议扩展来定义initP,因此该函数将在任何已知对象实现该协议时可用。

B().initP()

let b:B
b.initP()

class C : P {
    init() {
        initP()
    }
}

class B: A, P {
    override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
        super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
        initP()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        initP()
    }
}

都是有效的。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-06
  • 2020-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多