代码之家  ›  专栏  ›  技术社区  ›  Ricardo Amores

swift类:用指向成员函数的闭包声明变量

  •  0
  • Ricardo Amores  · 技术社区  · 6 年前

    使用带xcode10 beta的swift 4.2

    我试图创建一个作为字段存储的swift类,一个指向类的成员函数的闭包。

    这种想法是对战略模式的一种变化。我希望能够更改运行时调用的函数。在本例中,public f()函数调用内部闭包。闭包应该存储f_release或f_debug,后者只添加一些调试打印语句:

    class MyClass {
    
        var n:Int = 0
        var aFunc: (Int) -> ()
    
        init() {
            aFunc = f_release
        }
    
        public func f(number:Int) {
            aFunc(number)
        }
    
        func f_release(number:Int) {
            n = n + number
        }
    
        func f_debug(number:Int) {
            print(n)
            f_release(number:number)
            print(n)
        }
    }
    

    我的问题出现在初始化时。在上面的例子中,编译器会抱怨: _在初始化所有存储属性之前,在方法调用“f_release”中使用“self”_

    我尝试用默认值初始化afunc变量来解决替换行的问题。

        var aFunc: (Int) -> ()
    

    带线条

        var aFunc: (Int) -> () = f_release
    

    然而,对于这种情况,编译器现在抱怨: 无法将类型'(MyClass)->(int)->()'的值转换为指定的类型'(int)->()'

    我做错了什么? 提前谢谢

    2 回复  |  直到 6 年前
        1
  •  1
  •   Dávid Pásztor    6 年前

    无法在初始值设定项内分配值,因为您正尝试将实例属性(或特定情况下的函数)分配给另一个实例属性,但在初始值设定项中,它们都不能保证初始化。

    你可以通过声明来解决你的问题 aFunc 像懒惰一样。你也不再需要初始值设定项了。

    lazy var aFunc: (Int) -> () = f_release
    
        2
  •  2
  •   Nader    6 年前

    试试这个:

     class MyClass {
    
        var n:Int = 0
        lazy var aFunc: (Int) -> () = f_release
    
        public func f(number:Int) {
            aFunc(number)
        }
    
        func f_release(number:Int) {
            n = n + number
        }
    
        func f_debug(number:Int) {
            print(n)
            f_release(number:number)
            print(n)
        }
    }