我已經創建了一個通用視圖控制器來從列表中選擇一個項目,並且我想使用通用委託方法來返回已被選中的項目。我的設置如下:通用協議方法swift無法將類型識別爲類型
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的值沒有成員'。所以我試着將它轉換成類型
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
}
肯定有更好的辦法?或者這是一個快速的缺點?
對不起 - 我的意思是刪除WBSCode並用MyClass替換,現在更新 – mbdavis
MyClass爲什麼提到而不是實際類的解釋是合理的。然後,我們如何能夠迅速告訴這種方法應該是什麼類型?或者 - 它只是一個通用類型,它由你來施展它? –
mbdavis