代码之家  ›  专栏  ›  技术社区  ›  Martin Massera

swift-是否可以创建方法的键路径?

  •  7
  • Martin Massera  · 技术社区  · 8 年前

    是否可以创建引用方法的键路径?所有示例都是变量的路径。

    我正在尝试:

    class MyClass {
        init() {
            let myKeypath = \MyClass.handleMainAction
            ...
        }
        func handleMainAction() {...}
    }
    

    但它并没有说 Key path cannot refer to instance method 'handleMainAction()

    2 回复  |  直到 8 年前
        1
  •  5
  •   David S.    8 年前

    关键路径用于属性。然而,你可以有效地做同样的事情。由于函数是swift中的第一类类型,因此可以创建对handleMainAction的引用并传递:

    //: Playground - noun: a place where people can play
    
    import UIKit
    import XCTest
    import PlaygroundSupport
    
    class MyClass {
        var bar = 0
    
        private func handleMainAction() -> Int {
            bar = bar + 1
            return bar
        }
    
        func getMyMainAction() -> ()->Int {
            return self.handleMainAction
        }
    }
    
    class AnotherClass {
        func runSomeoneElsesBarFunc(passedFunction:() -> Int) {
            let result = passedFunction()
            print("What I got was \(result)")
        }
    }
    
    
    let myInst = MyClass()
    let anotherInst = AnotherClass()
    let barFunc = myInst.getMyMainAction()
    
    anotherInst.runSomeoneElsesBarFunc(passedFunction: barFunc)
    anotherInst.runSomeoneElsesBarFunc(passedFunction: barFunc)
    anotherInst.runSomeoneElsesBarFunc(passedFunction: barFunc)
    

    这将很好地工作,您可以将“barFunc”传递给任何其他类或方法,并且可以使用它。

        2
  •  4
  •   Kelvin    8 年前

    您可以使用 MyClass.handleMainAction

    let ref = MyClass.handleMainAction  //a block that returns the instance method
    let myInstance = MyClass()
    let instanceMethod = ref(myInstance)
    instanceMethod()                    //invoke the instance method
    

    关键是,您可以像使用键路径一样传递/存储方法引用。当需要调用该方法时,只需提供实际实例。