@dynamicCallable 的实现要求

2020-01-13 英文原文

如果用修饰符1 @dynamicCallable 标记一个类型,那它还必须要实现 dynamicallyCall(withArguments:) 和/或 dynamicallyCall(withKeywordArguments:) 方法,否则会导致编译错误。需要注意的是,必须要实现 dynamicallyCall(withKeywordArguments:) 才能在调用时使用关键字参数/实际参数标签。

有效的 dynamicallyCall(withArguments:) 实现必须:

  • 是一个实例方法,而不是 static 或者 class 方法。
  • 接受一个类型遵循 ExpressibleByArrayLiteral 协议的参数——通常这会是 Swift 自带的 Array 类型。
  • 返回一个有效的类型。

有效的 dynamicallyCall(withKeywordArguments:) 实现必须:

  • 是一个实例方法,而不是 static 或者 class 方法。
  • 接受一个类型遵循 ExpressibleByDictionaryLiteral 协议的参数。这个可以是 DictionaryKeyValuePairs(用于支持重复的关键字参数)或者其他遵循该协议的类型。
  • 让参数类型的关联类型 Key 遵循 ExpressibleByStringLiteral 协议。这个会是参数关键字的类型。
  • 让参数类型的关联类型 Value 以及返回类型为有效的类型。

  1. attribute,又译作“特性”。 ↩︎

许可协议:Apache 2.0 许可+运行时特许

属性包装器的实现要求

闭包类型推断

comments powered by Disqus