为什么Swift编译器无法调用我给Dictionary定义的自定义subscript?
问题原因
这个现象是Swift的编译顺序规则和重载决议优先级共同导致的:
- 你当前的代码定义顺序是
MyClass → Dictionary扩展,Swift是逐行顺序编译的,编译到MyClass内部的myMethod代码时,编译器还没有读到后续定义的fileprivate级别的Dictionary扩展,所以默认会优先调用系统自带的、返回Optional类型的Dictionary下标。 - 对于
.one这类枚举字面量、allTypes[index]这类编译时可以完全锁定类型的表达式,Swift的类型检查阶段会在全文件范围内做二次符号查找,此时编译器已经读完了整个文件的所有定义,找到了你写的匹配Key == MyEnum, Value == MyStruct约束的自定义下标,所以会自动使用非可选返回的自定义实现。 - 而方法参数
type、计算属性currentSelectedType属于动态值,编译前期解析阶段就已经匹配了系统的可选下标,不会触发后续的全文件符号查找,因此会报需要手动解包的错误。
解决方案
把你写的Dictionary扩展的代码移动到MyClass定义的前面即可,调整顺序后所有data[xxx]的调用都会优先匹配你自定义的非可选下标,无需手动解包。
内容的提问来源于stack exchange,提问作者Eyad
相关产品推荐
相关产品推荐

