如何在Swift中将函数从类实例传递到数组

时间:2019-03-15 19:27:28

标签: swift

不确定这是否是最好的方法,但是我想让索引可以访问函数,并且不希望使用字典。所以我正在考虑将它们放入数组。

var array = [ func1, func2, ... ]

由于函数是一等公民,因此这似乎是可能的。

但是,我想知道您是否可以在课堂上这样做。也就是说,将函数从类实例传递到数组,而不会因额外的闭包而损失性能。

class Foo {
  var array: [Function]

  init() {
    array = [ f1, f2 ]
  }

  func f1() {
    return array.length
  }

  func f2(a: Int, b: Int) {
    // ... the functions are all different.
  }
}

想知道是否有可能这样做。

1 个答案:

答案 0 :(得分:2)

快速数组是同构的,但是您可以使用Any来装箱任何类型,但会丢失类型信息,因此,是的,即使它们具有不同的类型,也可以将所有函数粘贴到单个数组中。我并不特别认为这是个好主意,但实际上确实有效:

import UIKit
import PlaygroundSupport


class Foo {
    var array: [Any] = []

    init() {
        array = [ f1, f2 ]
    }

    func f1() -> Int {
        return array.count
    }

    func f2(a: Int, b: Int) {
        // ... the functions are all different.
    }
}

如果使用Objective C运行时,这也许不太可怕,因为它是动态的,您可以使用带有参数的perform选择器来调用选择器,但是我仍然不建议这样做:< / p>

import UIKit
import PlaygroundSupport


class Foo {
    var array: [Selector] = []

    init() {
        array = [#selector(f1), #selector(f2) ]
    }

    @objc func f1() -> Int {
        return array.count
    }

    @objc func f2(a: Int, b: Int) {
        // ... the functions are all different.
    }
}

编辑:

选项3,带有关联值的枚举(出现比我这里更有意义的名称):

import UIKit
import PlaygroundSupport


class Foo {

    enum Function {
        case void_Int(() -> Int)
        case intInt_Void((Int,Int) -> Void)
    }

    var array: [Function] = []

    init() {
        array = [.void_Int(f1), .intInt_Void(f2) ]
    }

    @objc func f1() -> Int {
        return array.count
    }

    @objc func f2(a: Int, b: Int) {
        // ... the functions are all different.
    }
}