sha*_* te 8 protocols inline lazy-evaluation ios swift
我想懒惰/内联在Swift中实现一个协议.因此,在实现方面,我将访问协议范围之外的变量,
与在Java中实现接口而不声明类相同:
class MyClass:UIView {
  var someComponent:SomeInnerComponent = SomeInnerComponent();
  var count:Int = 0;
  var a = :SomeProtocol { //<----- IS THIS POSSIBLE, IF YES HOW ?
      func a0() {MyClass.count--}
      func a1() {MyClass.count++}
  } 
  someComponenet.delegate = a;
}
protocol SomeProtocol {
  func a0()
  func a1()
}
编辑----
谢谢我看看这个解决方案,我没有看到如何访问父类的变量.所有示例都显示了一个Anonymous类,但没有一个示例正在访问父变量.
您正在寻找的是一个内部类(不一定是匿名的),在一个允许它访问实例count变量的范围中声明MyClass,并且采用在不同范围内定义的协议。现在 Swift 已经有了其中的一些部分,但看起来您无法以任何您想要的简洁方式将它们全部组合在一起。
您可能会考虑声明一个内部类:
class MyView: UIView {
    let someComponent = SomeInnerComponent() // type SomeInnerComponent is inferred
    var count = 0 // type Int is inferred
    class Helper: SomeProtocol {
        func a0() { count-- } // ERROR
        // ...
    }
    init() {
        someComponent.delegate = Helper()
    }
}
但这是行不通的,因为count隐式地self.count是self一个Helper实例,而不是MyView“拥有”该Helper实例的实例。并且没有办法MyView从 a 的方法中引用该实例(或其属性)Helper,因为您也可以在MyView.Helper()没有现有MyView实例的情况下构造 a 。Swift 中的内部类(或一般的嵌套类型)仅嵌套在词法范围内,而不嵌套在存在所有权中。(或者换句话说,既然您引用了 Java:Swift 中的所有内部类都类似于 Java 中的静态内部类。没有非静态内部类。)不过,如果这是您想要的功能,那么它可能值得一说苹果你想要它。
您还可以尝试在 Swift 中声明Helperinside MyView.init()- 您可以在任何地方嵌套类型定义,包括内部函数或其他类型的方法。在那里定义,它可以引用 的MyView属性。但是,现在 的类型信息Helper仅在 内部可见MyView.init(),因此当您将其分配给someComponent.delegate(其类型仅为SomeProtocol)时,您无法使用它......这甚至会使编译器崩溃。(这是另一个需要报告的错误,但很难说该错误是否真的是“编译器在有效使用时崩溃”或“代码很糟糕,但编译器崩溃而不是产生错误”。)
我能想到的最接近的解决方案看起来像这样:
class SomeInnerComponent {
    var delegate: SomeProtocol?
}
protocol SomeProtocol {
    func a0()
    func a1()
}
class MyClass  {
    var someComponent = SomeInnerComponent()
    var count = 0
    struct Helper: SomeProtocol {
        var dec: () -> ()
        var inc: () -> ()
        func a0() { dec() }
        func a1() { inc() }
    }
    init() {
        someComponent.delegate = Helper(
            dec: { self.count -= 1 }, // see note below
            inc: { self.count += 1 }
        )
    }
}
怎么运行的:
Helper是一个内部结构(可以是一个类,但结构更简单)a0和a1方法,满足以下要求SomeProtocola0和a1调用闭包dec和,它们是结构inc的存储属性(也称为实例变量)HelperHelper(使用默认的成员初始化器,Helper(dec: (Void -> Void), inc: (Void -> Void)))Helper,所以这些闭包可以捕获调用初始化程序的变量,包括self引用MyClass创建 的实例的隐式变量Helper。您需要a0/a1和dec/ ,inc因为您需要闭包(后者),而不是方法来捕获封闭状态。尽管闭包和函数/方法在很多方面可以互换,但您无法通过将闭包分配给方法/函数名称来创建方法/函数实现。SomeProtocol(如果需要闭包属性而不是方法,那将是一个不同的故事,但我假设SomeProtocol这不在您的控制之下。)
无论如何,这是一种您可能并不真正需要的大量样板文件和抽象层,因此可能值得研究其他方法来构建代码。
{ self.count -= 1 }注意:我的示例使用了您可能期望的闭包{ self.count-- }。后者不起作用,因为这是一个带有值的表达式,因此 Swift 会将其解释为闭包返回值的简写。然后它会抱怨你() -> Int给一个需要() -> ()(又名Void -> Void)闭包的属性分配了一个闭包。使用-= 1替代方法可以解决此问题。