【Swift】如何让实例对象像函数一样使用

形如

复制代码
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。
    当目标调用的时候,参数带标签。

参考

相关推荐
2601_955767423 小时前
iPhone 17 护眼保护膜怎么选?圆偏振光 + AR 抗眩方案,解读 96% 透光率与 ≤0.5% 反射率的协同价值
ios·ar·iphone·圆偏振光·#观复盾护景贴·scinique双护技术
三雒3 小时前
KMP 实战:Android 开发如何快速统一双端 IM 模块
android·ios·kotlin
秋雨梧桐叶落莳4 小时前
iOS——抽屉视图详解
开发语言·macos·ui·ios·objective-c·cocoa
库奇噜啦呼4 小时前
【iOS】源码学习-方法交换
学习·ios·cocoa
hurrycry_小亦16 小时前
苹果WWDC 2026前瞻:Ferret-Pro端侧大模型即将亮相|小亦之闻|AI 编程三日速递!(5月26日~5月28日)
macos·ios·wwdc
UTF_820 小时前
一次NSMutableAttributedString误用的思考
ios·面试·github
人月神话-Lee1 天前
【图像处理】Core Image 与 GPU 渲染管线——让滤镜飞起来
图像处理·人工智能·ios·chatgpt·ai编程·swift·gpu
夏天的峰没有风1 天前
Typora+gitcode+picgo搭建免费图床
开发语言·ios·swift
库奇噜啦呼1 天前
【iOS】源码学习-分类、扩展、关联对象
学习·ios·分类
帅次2 天前
Android 17 开发者实战:核心更新与应用场景落地指南
android·java·ios·android studio·iphone·android jetpack·webview