我正在尝试将泛型与协议混合在一起,我的xD非常困难
我在Android/Java项目中实现了某些架构,我正在尝试重写它以适应swift/iOS项目.但我发现了这个限制.
ProtocolA
protocol ProtocolA {
}
Run Code Online (Sandbox Code Playgroud)
ProtocolB
protocol ProtocolB : ProtocolA {
}
Run Code Online (Sandbox Code Playgroud)
ImplementProtocolA
class ImplementProtocolA <P : ProtocolA> {
let currentProtocol : P
init(currentProtocol : P) {
self.currentProtocol = currentProtocol
}
}
Run Code Online (Sandbox Code Playgroud)
ImplementProtocolB
class ImplementProtocolB : ImplementProtocolA<ProtocolB> {
}
Run Code Online (Sandbox Code Playgroud)
因此,当我尝试将ProtocolB设置为实现ProtocolA的具体类型时,我收到此错误:
不支持使用'ProtocolB'作为符合协议'ProtocolA'的具体类型
1这种"限制"有什么理由吗?
2是否有任何解决方法可以实现此功能?
3它会在某个时候得到支持吗?
- 更新 -
我认为同一问题的另一个变种是:
查看协议
protocol View {
}
protocol GetUserView : View {
func showProgress()
func hideProgress()
func showError(message:String)
func showUser(userDemo:UserDemo)
}
Run Code Online (Sandbox Code Playgroud)
演示者协议
protocol Presenter {
typealias V : …Run Code Online (Sandbox Code Playgroud) 我试图为我的应用程序创建一个GenericListController.
我有一个ProductListController,它扩展了这个扩展UIViewController的通用控制器.我已将ProductListController连接到故事板并制作了2个插座,但我总是收到此错误:
Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<UIViewController 0x7c158ca0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key searchBar.'
Run Code Online (Sandbox Code Playgroud)
我收到这个错误的所有我的网点,如果我从GenericListController删除通用T它的工作原理.我猜一个故事板不能用泛型加载超级.我怎样才能使它工作?
我的代码:
class GenericListController<T> : UIViewController {
var list : [T] = [T]()
var filteredlist : [T] = [T]()
func getData(tableView : UITableView) {
.....
}
func setData(list : [T], tableView : UITableView) {
.....
}
override func viewDidLoad() {
super.viewDidLoad()
}
}
class ProductListController : GenericListController<ProductModel> {
@IBOutlet weak var searchBar: UISearchBar!
@IBOutlet weak var …Run Code Online (Sandbox Code Playgroud) 我有一个通用类:
class PaginatedTableViewController
<GenericElement, Source: PaginationDataSource
where Source.PaginatedGenericElement == GenericElement>:
UITableViewController
Run Code Online (Sandbox Code Playgroud)
另一个我试图从故事板中实例化:
class CandidatesTableViewController:
PaginatedTableViewController<Match, MatchPaginationDataSource>
Run Code Online (Sandbox Code Playgroud)
我CandidatesTableViewController在故事板Custom Class下拉菜单中找不到.如果我强制它然后在代码中转换我的控制器,应用程序在运行时崩溃抱怨我的控制器(应该是CandidatesTableViewController实例)实际上是一个UITableViewController实例.
Interface Builder文件中的未知类_TtC21MyProjectName29CandidatesTableViewController.无法将'UITableViewController'类型的值(0x1040917f8)转换为'MyProjectName.CandidatesTableViewController'(0x1013a9890).
在我的项目中,这个控制器嵌入另一个控制器,这就是我投射它的原因:
tableViewController = (segue.destinationViewController as! CandidatesTableViewController)
Run Code Online (Sandbox Code Playgroud)
有谁知道如何解决这个问题?