Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Swift中将函数从类实例传递到数组_Swift - Fatal编程技术网

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

如何在Swift中将函数从类实例传递到数组,swift,Swift,不确定这是否是最好的方法,但我希望函数可以通过索引访问,并且不希望使用字典。所以我想把它们放到一个数组中 var array = [ func1, func2, ... ] 看起来这是可能的,因为函数是一等公民 但我想知道你是否可以在课堂上这样做。也就是说,将函数从类实例传递到数组,而不会因为额外的闭包而损失性能 class Foo { var array: [Function] init() { array = [ f1, f2 ] } func f1()

不确定这是否是最好的方法,但我希望函数可以通过索引访问,并且不希望使用字典。所以我想把它们放到一个数组中

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.
  }
}

想知道这样做是否可行。

Swift数组是同构的,但是您可以使用
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运行时,这可能就不那么可怕了,因为它是动态的,您可以使用带有参数的选择器来调用选择器,但我仍然不建议这样做:

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,带有关联值的枚举(提出比我这里有更多有意义的名称):


Swift数组是同构的,但您可以使用
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运行时,这可能就不那么可怕了,因为它是动态的,您可以使用带有参数的选择器来调用选择器,但我仍然不建议这样做:

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,带有关联值的枚举(提出比我这里有更多有意义的名称):


可能有帮助:。所有函数是否具有相同的签名?您的第一个
func f1()
似乎返回了一个值。不抱歉,它们都会不同,我将更新。然后
f1
f2
有不同的类型。你不能将它们存储在一个公共数组中(只能作为
Any
,这会让事情变得丑陋)。你想实现什么?使用
var array:[Any]
您必须将每个元素转换回正确的函数类型才能调用函数,即您必须知道每个元素的签名(或尝试所有可能的签名)。可能有用:。所有函数是否都具有相同的签名?您的第一个
func f1()
似乎返回了一个值。不抱歉,它们都会不同,我将更新。然后
f1
f2
有不同的类型。你不能将它们存储在一个公共数组中(只能作为
Any
,这会让事情变得丑陋)。你想实现什么?使用
var array:[Any]
您必须将每个元素转换回正确的函数类型才能调用该函数,即您必须知道每个元素的签名(或尝试所有可能的签名)。这肯定回答了问题,但是的,我认为这并不理想。我想动态调用给定整数的函数,所以数组是第一选择。不知道你会推荐什么。switch语句可以工作,但如果函数数量达到100,则会增加大量处理。字典可能有用,但它使用的是隐藏的散列。也许你还知道其他一些方法。如果你真的不需要任何类型,但只需要有限多的类型,那么使用一个枚举,每个可能的类型都有相关的值。这使您可以将所有函数放在一个数组中,而不会丢失字符串类型(即函数由枚举而不是任何函数装箱)。也许您不介意演示,我将尝试。听起来你说的是一个枚举,其中键/值对是函数,它们将被索引。这肯定回答了这个问题,但我认为这并不理想。我想动态调用给定整数的函数,所以数组是第一选择。不知道你会推荐什么。switch语句可以工作,但如果函数数量达到100,则会增加大量处理。字典可能有用,但它使用的是隐藏的散列。也许你还知道其他一些方法。如果你真的不需要任何类型,但只需要有限多的类型,那么使用一个枚举,每个可能的类型都有相关的值。这使您可以将所有函数放在一个数组中,而不会丢失字符串类型(即函数由枚举而不是任何函数装箱)。也许您不介意演示,我将尝试。听起来像是说一个枚举,其中键/值对是函数,它们将被索引。