Swift中如何通过点符号动态访问自定义类型的displayOrder属性?
解决Swift中动态访问不同类型共同属性的问题
Swift是强类型语言,和JavaScript的动态类型机制不同,不能直接把不同类型的实例混放进数组后直接访问共同属性,也不能通过字符串变量直接映射到实例属性。针对你的需求,最规范的解决方式是通过协议统一接口:
步骤1:定义包含共同属性的协议
先创建一个协议,声明两个结构体都有的displayOrder属性:
protocol DisplayOrderable { var displayOrder: Int { get set } }
步骤2:让结构体遵守协议
修改你的结构体定义,让它们遵守这个协议(因为已经实现了displayOrder属性,不需要额外编写实现代码):
struct QuestionConfiguration: Codable, DisplayOrderable { var displayOrder: Int } struct PriorityConfiguration: Codable, DisplayOrderable { var displayOrder: Int }
步骤3:使用协议类型数组动态访问属性
现在你可以把两个实例放进[DisplayOrderable]类型的数组里,直接访问每个元素的displayOrder:
var configs: [DisplayOrderable] = [questionConfiguration, priorityConfiguration] // 假设i是合法的索引(0或1) print(configs[i].displayOrder)
为什么你的原有写法不行?
- 第一种写法:
[self.questionConfiguration, self.priorityConfiguration]的类型是[Any],Any类型没有displayOrder属性,编译器无法识别。 - 第二种写法:数组里存的是字符串字面量,字符串本身当然没有
displayOrder属性,Swift也不会自动把字符串映射到当前上下文的实例变量。
内容的提问来源于stack exchange,提问作者Joseph
相关产品推荐
相关产品推荐

