如何用 swift 重写 Objective-C 宏展开
How rewrite Objective-C Macro expand with swift
Objective-C 宏是这样的:
#define CALL_FUNC(classname, times, classfuncWithParamter) \
{\
for (int i = 0; i< times; i++) {\
[classname classfuncWithParamter]\
}\
}\
要求 Objective-C:
CALL_FUNC(AnClass, 10, setName:@"test" withPhone:12345)
令我困惑的是这个for循环调用func,宏可以做文本替换来做到这一点
在 Swift 中处理此宏的最佳方法是什么?
正如人们在评论中所说,您需要使用泛型和闭包。诀窍是如果你想支持多个参数,你必须多次声明“宏”:
// for functions with no arguments
func call<T>(times: Int, _ f: () -> T) {
for i in 0..<times { f() }
}
// for functions with one argument
func call<A, T>(times: Int, _ f: (A) -> T, _ arg: A) {
for i in 0..<times { f(arg) }
}
// for functions with two arguments
func call<A1, A2, T>(times: Int, f: (A1, A2) -> T, _ a1: A1, _ a2: A2) {
for i in 0..<times { f(a1, a2) }
}
// for functions with three arguments
func call<A1, A2, A3, T>(times: Int, f: (A1, A2, A3) -> T, _ a1: A1, _ a2: A2, _ a3: A3) {
for i in 0..<times { f(a1, a2, a3) }
}
// and so on...
对于您问题中的示例,调用将如下所示:
call(times: 10, AnClass.setName(_:withPhone:), "test", 12345)
,或者你可以传递一个闭包,让代码更具可读性,像这样:
call(times: 10) { AnClass.setName("test", withPhone: 12345) }
,如果你选择这条路,你只能保留第一个 call
定义,即没有参数的定义:func call<T>(_ times: Int, f: () -> T)
。在闭包中调用所需的函数也更加灵活,因为您可以在该闭包中支持任意数量的参数。
Objective-C 宏是这样的:
#define CALL_FUNC(classname, times, classfuncWithParamter) \
{\
for (int i = 0; i< times; i++) {\
[classname classfuncWithParamter]\
}\
}\
要求 Objective-C:
CALL_FUNC(AnClass, 10, setName:@"test" withPhone:12345)
令我困惑的是这个for循环调用func,宏可以做文本替换来做到这一点
在 Swift 中处理此宏的最佳方法是什么?
正如人们在评论中所说,您需要使用泛型和闭包。诀窍是如果你想支持多个参数,你必须多次声明“宏”:
// for functions with no arguments
func call<T>(times: Int, _ f: () -> T) {
for i in 0..<times { f() }
}
// for functions with one argument
func call<A, T>(times: Int, _ f: (A) -> T, _ arg: A) {
for i in 0..<times { f(arg) }
}
// for functions with two arguments
func call<A1, A2, T>(times: Int, f: (A1, A2) -> T, _ a1: A1, _ a2: A2) {
for i in 0..<times { f(a1, a2) }
}
// for functions with three arguments
func call<A1, A2, A3, T>(times: Int, f: (A1, A2, A3) -> T, _ a1: A1, _ a2: A2, _ a3: A3) {
for i in 0..<times { f(a1, a2, a3) }
}
// and so on...
对于您问题中的示例,调用将如下所示:
call(times: 10, AnClass.setName(_:withPhone:), "test", 12345)
,或者你可以传递一个闭包,让代码更具可读性,像这样:
call(times: 10) { AnClass.setName("test", withPhone: 12345) }
,如果你选择这条路,你只能保留第一个 call
定义,即没有参数的定义:func call<T>(_ times: Int, f: () -> T)
。在闭包中调用所需的函数也更加灵活,因为您可以在该闭包中支持任意数量的参数。