如果用修饰符1 @dynamicCallable
标记一个类型,那它还必须要实现 dynamicallyCall(withArguments:)
和/或 dynamicallyCall(withKeywordArguments:)
方法,否则会导致编译错误。需要注意的是,必须要实现 dynamicallyCall(withKeywordArguments:)
才能在调用时使用关键字参数/实际参数标签。
有效的 dynamicallyCall(withArguments:)
实现必须:
- 是一个实例方法,而不是
static
或者class
方法。 - 接受一个类型遵循
ExpressibleByArrayLiteral
协议的参数——通常这会是 Swift 自带的Array
类型。 - 返回一个有效的类型。
有效的 dynamicallyCall(withKeywordArguments:)
实现必须:
- 是一个实例方法,而不是
static
或者class
方法。 - 接受一个类型遵循
ExpressibleByDictionaryLiteral
协议的参数。这个可以是Dictionary
、KeyValuePairs
(用于支持重复的关键字参数)或者其他遵循该协议的类型。 - 让参数类型的关联类型
Key
遵循ExpressibleByStringLiteral
协议。这个会是参数关键字的类型。 - 让参数类型的关联类型
Value
以及返回类型为有效的类型。
attribute,又译作“特性”。 ↩︎