¿Es posible crear una ruta clave que haga referencia a un método? todos los ejemplos son rutas a variables.

Estoy intentando esto:

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

Pero no se compila diciendo Key path cannot refer to instance method 'handleMainAction()

6
Martin Massera 15 nov. 2017 a las 21:42

2 respuestas

La mejor respuesta

KeyPaths son para propiedades. Sin embargo, puede hacer efectivamente lo mismo. Debido a que las funciones son tipos de primera clase en Swift, puede crear una referencia para handleMainAction y pasarla:

//: 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)

Esto funcionará bien y puede pasar "barFunc" a cualquier otra clase o método y puede usarse.

5
David S. 15 nov. 2017 a las 19:05

Puede utilizar MyClass.handleMainAction como referencia indirecta. Le proporciona un bloque que toma la instancia de la clase como parámetro de entrada y devuelve el método de instancia correspondiente.

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

El punto es que puede pasar / almacenar la referencia del método como lo hizo con una ruta clave. Solo necesita proporcionar la instancia real cuando necesite invocar el método.

3
Kelvin 4 mar. 2018 a las 06:42