如何创建一个函数,将函数中定义的任何函数作为参数?

时间:2015-12-16 05:58:22

标签: arrays swift function swift2 function-parameter

我正在制作纸牌游戏,并希望制作一个能够遍历我的Players阵列的功能,并为每个玩家执行一些功能,所以我没有吨和吨/ p>

for var player in Players {
    player.doSomeFunction()
}

我的所有代码。相反,我喜欢以下内容:

func everyone(doThis: func) {
    for var player in Players {
        player.doThis(<params, etc…>)
    }
}

这样我就可以在代码的其他地方调用Players.everyone(doThis(params, etc…)),而不是每次我需要让所有玩家做某事时都要遍历玩家。

如何创建一个将协议中定义的任何函数作为参数的函数?我遇到的麻烦就是当你使用函数时似乎作为Swift中的参数,您必须在函数声明中定义函数参数的参数和返回类型。或者,是否有内置的方式来调用Players.forAllElements(doThisFunction)(其中PlayersArray<Player>)?

如果它有帮助,我有两个符合Player协议的类:ComputerPlayerHumanPlayer

2 个答案:

答案 0 :(得分:1)

似乎没有办法在swift中表达 any-function-in-a-protocol ,以便用于某种参数类型的定义。

但是,使用currying和函数类型,您可以执行类似的操作:。您可以使用相同的签名定位所有函数:

class Player {
    var name: String
    init(_ name: String) {
        self.name = name
    }

    // Both actions, even if they have different parameter names,
    // have the same function signature
    func actionOne(foo: String, count:Int) {
        print("actionOne:\(name):\(foo):\(count)")
    }

    func actionTwo(bar: String, amount: Int) {
        print("actionTwo:\(name):\(bar):\(amount)")
    }
}

let players = [Player("Primero"), Player("Segundo")]

// A function type that receives a Player object, and returns a
// function with the `String, Int` signature
typealias PlayerActionType = (Player) -> (String, Int) -> ()

// This is the function that takes the curried function, and can
// run any function sharing the same signature
func performAction(curriedFunction: PlayerActionType) {
    for currentPlayer in players {
        let actionFunction = curriedFunction(currentPlayer)
        actionFunction("string", 3)
    }
}

performAction(Player.actionOne)
performAction(Player.actionTwo)

// Prints:
// actionOne:Primero:string:3
// actionOne:Segundo:string:3
// actionTwo:Primero:string:3
// actionTwo:Segundo:string:3

答案 1 :(得分:0)

你可以这样做。 makePrint是一个带选择器的函数。你可以这样称呼它。

 [self makePrint:@selector(print)];

-(void)makePrint:(SEL)selector{
    [self performSelector:selector];
}
-(void)print{
   NSLog(@"print");
 }