动态型铸造在swift 4

时间:2018-03-14 07:17:25

标签: swift casting

我有一个名为Filters

的班级
class Filters {

   typealias States = [State]
   typealias Cities = [City]
   typealias Areas = [Area]

   var states : States?
   var cities : Cities?
   var areas : Areas?
}

FilterViewController中,根据用户的选择,pickerViewItems将填充filters.statesfilters.citiesfilters.areas的项目。< / p>

问题是当我使用三个数组项之一填充pickerViewItems时,例如filters.states,我无法将其投放到States,因此我可以使用

pickerViewItems[row].name

  

类型的价值&#39;任何&#39;没有会员&#39;名称&#39;

如何在Swift中动态设置pickerViewItems的类型?

1 个答案:

答案 0 :(得分:2)

Swift几乎是一种静态语言,因此您无法动态更改类型。因此,我们将使用 polymorphism 解决此问题。

假设StateCityArea都具有name属性,您可以创建如下协议:

protocol NamedLocation {
    var name: String { get; }
}

并使所有三个类符合协议:

extension State: NamedLocation { }
extension City: NamedLocation { }
extension Area: NamedLocation { }

现在,您可以将pickerViewItems设为[NamedLocation]类型,然后仍然可以访问name媒体资源。