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

参考

相关推荐

  1. Swift如何实例对象函数一样使用

    2024-03-25 04:40:04       43 阅读
  2. 如何专家一样维护服务器硬件?

    2024-03-25 04:40:04       38 阅读
  3. Swift 函数

    2024-03-25 04:40:04       32 阅读
  4. 函数对象基本使用

    2024-03-25 04:40:04       44 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-25 04:40:04       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-25 04:40:04       100 阅读
  3. 在Django里面运行非项目文件

    2024-03-25 04:40:04       82 阅读
  4. Python语言-面向对象

    2024-03-25 04:40:04       91 阅读

热门阅读

  1. ftp协议的彻底研究

    2024-03-25 04:40:04       35 阅读
  2. c++和c语言的区别实例

    2024-03-25 04:40:04       40 阅读
  3. 再次度过我的创作纪念日

    2024-03-25 04:40:04       34 阅读
  4. MySQL索引介绍

    2024-03-25 04:40:04       35 阅读
  5. Qt笔记 事件分发

    2024-03-25 04:40:04       37 阅读
  6. Qt:使用ctrl+z快捷键取消文本框修改

    2024-03-25 04:40:04       39 阅读
  7. Android Selinux详解[七]--如何给可执行程序bin加标签

    2024-03-25 04:40:04       35 阅读
  8. ES间的导数脚本

    2024-03-25 04:40:04       40 阅读
  9. clickhouse介绍

    2024-03-25 04:40:04       41 阅读
  10. 如何借助API提升产品设计的用户体验

    2024-03-25 04:40:04       38 阅读