如何在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,则会增加大量处理。字典可能有用,但它使用的是隐藏的散列。也许你还知道其他一些方法。如果你真的不需要任何类型,但只需要有限多的类型,那么使用一个枚举,每个可能的类型都有相关的值。这使您可以将所有函数放在一个数组中,而不会丢失字符串类型(即函数由枚举而不是任何函数装箱)。也许您不介意演示,我将尝试。听起来像是说一个枚举,其中键/值对是函数,它们将被索引。