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

参考

相关推荐
初级代码游戏18 小时前
iOS开发 SwiftUI 8:NavigationView 导航
ios·swiftui·swift
美狐美颜SDK开放平台20 小时前
跨平台开发实战:直播美颜sdk动态贴纸在 Android / iOS / HarmonyOS 的落地方案
android·ios·harmonyos·美颜sdk·直播美颜sdk·视频美颜sdk·美颜api
2501_9160088920 小时前
在不越狱前提下导出 iOS 应用文件的过程,访问应用沙盒目录,获取真实数据
android·macos·ios·小程序·uni-app·cocoa·iphone
2501_9151063220 小时前
Android和IOS 移动应用App图标生成与使用 Assets.car生成
android·ios·小程序·https·uni-app·iphone·webview
虹少侠20 小时前
基于 WebKit 构建 macOS 多浮窗视频播放的技术实践(含完整产品落地)
前端·macos·swift·webkit
2501_9159184121 小时前
Mac 抓包软件有哪些?Charles、mitmproxy、Wireshark和Sniffmaster哪个更合适
android·ios·小程序·https·uni-app·iphone·webview
2501_9151063221 小时前
iOS 抓包绕过 SSL 证书认证, HTTPS 暴力抓包、数据流分析
android·ios·小程序·https·uni-app·iphone·ssl
WeiAreYoung21 小时前
uni-app xcode 制作iOS Notification Service Extension 远程推送图文原生插件
ios·uni-app·xcode
2501_915921431 天前
iOS App 电耗管理 通过系统电池记录、Xcode Instruments 与克魔(KeyMob)组合使用
android·ios·小程序·https·uni-app·iphone·webview
且去填词2 天前
Context 详解:如何在微服务链路中传递取消信号与超时控制
ios·iphone