【发布时间】:2017-03-08 10:31:14
【问题描述】:
我创建了一个通用视图控制器来从列表中选择一个项目,我想使用一个通用委托方法来返回已选择的项目。我的设置如下:
class ListPickerViewController<T>: UIViewController {
var delegate: ListPickerViewControllerDelegate?
}
protocol ListPickerViewControllerDelegate {
func listPickerViewControllerDelegate<T>(_ listPickerViewController: ListPickerViewController<T>, selectedItem: T)
}
我有一个对象列表,我将使用它来填充 ListPickerViewController
class MyClass {
let a = "sometext"
}
在类中,我想从中获取所选项目,我实现该方法并为所选项目委托一个类型参数,用于列表中的对象类型。
func listPickerViewControllerDelegate<MyClass>(_ listPickerViewController: ListPickerViewController<MyClass>, selectedItem: MyClass) {
print(selectedItem.a)
}
然而,这不会编译!我收到错误“MyClass 类型的值没有成员 a”。所以我尝试将其转换为类型
func listPickerViewControllerDelegate<MyClass>(_ listPickerViewController: ListPickerViewController<MyClass>, selectedItem: MyClass) {
let selected = selectedItem as! MyClass
}
这使得“强制将 MyClass 强制转换为相同类型没有效果”。
出于某种原因,我发现这是可行的:
typealias MyClassAlias = MyClass
func listPickerViewControllerDelegate<MyClass>(_ listPickerViewController: ListPickerViewController<MyClass>, selectedItem: MyClass) {
let selected = selectedItem as MyClassAlias
print(selected.a) // works
}
肯定有更好的方法吗?或者这是swift的缺点?
【问题讨论】:
标签: swift generics swift3 polymorphism swift-protocols