我正在制作纸牌游戏,并希望制作一个能够遍历我的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)
(其中Players
是Array<Player>
)?
如果它有帮助,我有两个符合Player
协议的类:ComputerPlayer
和HumanPlayer
。
答案 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");
}