如果用修饰符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,又译作“特性”。 ↩︎