形如
let p = Person()
p("zhangsan")
Swift 5 中引入了一个新的语法@dynamicCallable(动态可调用)。使用@dynamicCallable标记了目标以后(类、结构体、枚举、协议),实现dynamicallyCall方法后,目标可以像调用函数一样使用。
// 标记
@dynamicCallable
struct Person {
// 实现方法一
func dynamicallyCall(withArguments: [String]) {
for item in withArguments {
print(item)
}
}
// 实现方法二
func dynamicallyCall(withKeywordArguments: KeyValuePairs<String, String>){
for (key, value) in withKeywordArguments {
print("\(key) --- \(value)")
}
}
}
let p = Person()
p("zhangsan")
// 等于 p.dynamicallyCall(withArguments: ["zhangsan"])
p("zhangsan", "20", "男")
// 等于 p.dynamicallyCall(withArguments: ["zhangsan", "20", "男"])
p(name: "zhangsan")
// 等于 p.dynamicallyCall(withKeywordArguments: ["name": "zhangsan"])
p(name: "zhangsan", age:"20", sex: "男")
// 等于 p.dynamicallyCall(withKeywordArguments: ["name": "zhangsan", "age": "20", "sex": "男"])
注意
- 声明了@dynamicMemberLookup后,必须实现dynamicallyCall(withArguments:)和dynamicallyCall(withKeywordArguments:)两个方法中的至少一个,否则编译器会报错。
- 当目标调用的时候,会转换成方法的调用,然后传入对应的参数与参数类型。
- 实现了dynamicallyCall(withArguments:)
参数类型根据自己需要调整,如上例[String]。
当目标调用的时候,参数不带标签。
参数为数组时,可以理解为可变参数,调用时传入的参数可以是1个,也可以是多个。 - 实现了dynamicallyCall(withKeywordArguments:)
参数类型为KeyValuePairs,暂时可以把它当成字典来用,主要改变的是value的类型,如上例中为String。
当目标调用的时候,参数带标签。