2016-02-08 113 views
-2

是否可以将相同的方法添加到不同的类中?如何将相同的方法添加到不同的类中?

例子:

class FilterableTable: UITableViewController { ... } 
class FilterableCollection: UICollectionViewController { ... } 

extension FilterableTable, FilterableCollection { // I know this line is wrong 
    func filterItems(){ print('filtered!') } 
} 

如何添加相同美孚方法将UICollectionViewController

协议允许申报只需要签名方法,但我需要完全相同的方法(与机构),以避免复制粘贴...

+0

https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Inheritance.html – Stefan

+1

也许你应该建立在你的_model-layer_过滤类别...不上你的_controller-layer_ - 否则当你需要的时候,你需要在你的_contoller层的任何地方复制和粘贴正文。 MVC。 MVC。 MVC。我知道这很难学,但应该是。 – holex

+0

@holex没关系,你在想你很聪明。问题是 - 我不需要模型,而是需要它。根据型号的数据显示/更新按钮,控件等。 – norlin

回答

1

实际答案:Use the Delegates,卢克!

class FilterableTable: UITableViewController { 
    var filterDelegate: FilterDelegate! 
    func viewDidLoad(){ 
     filterDelegate = Filter() 
    } 
} 
class FilterableCollection: UICollectionViewController { 
    var filterDelegate: FilterDelegate! 
    func viewDidLoad(){ 
     filterDelegate = Filter() 
    } 
} 

protocol FilterDelegate { 
    func filterItems() 
} 

class Filter: FilterDelegate { 
    func filterItems() { 
     print("Hooray!") 
    } 
} 
2

您可以使用协议扩展到你所需要的。扩展是新的,并允许协议方法的默认实现。我修改了你的代码,所以它会编译。

class FilterableTable: FilterType { 
    init() {} 
} 
class FilterableCollection: FilterType { 
    init() {} 
} 

protocol FilterType { 
    func filterItems() 
} 
extension FilterType { // I know this line is wrong 
    func filterItems(){ print("filtered!") } 
} 

let a = FilterableTable() 
a.filterItems() 

let b = FilterableCollection() 
b.filterItems() 

查看协议扩展部分。 Swift Programming Guide

+0

我试过这个选项,但XCode总是在这样的事情上崩溃对我来说(不知道为什么,我有2个协议的子类,包括这一个)... – norlin

+1

上面应该在操场上自己运行。试一试,确保它适合你。您可能会尝试删除项目的派生数据,以查看是否清除了问题。查看Xcode 7.2更新的答案。 http://stackoverflow.com/questions/18933321/deleting-contents-from-xcode-derived-data-folder –

+0

是的,这个版本没问题,但是对于我来说,当扩展有一个'mutating'方法时,它会崩溃:https:/ /github.com/norlin/xcode-crash-protocol-extension – norlin

相关问题