gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 11:36:30 26 4
gpt4 key购买 nike

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

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 运行时,也许这稍微不那么可怕,因为它是动态的,您可以实际使用 perform带有参数的选择器来调用选择器,但我仍然不推荐它:

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

关于swift - 如何在 Swift 中将函数从类实例传递到数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55189519/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com