多重继承问题Swift

时间:2015-12-31 12:01:53

标签: ios swift inheritance uiviewcontroller

我在Swift中遇到多重继承问题,这是我的情况:

在我的应用程序中,我有各种UITableViewControllerUIViewController,但两者都必须有各种字段,例如数组和两个字符串。 出于这个原因,我想创建一个超类'SuperClassTest',并且所有UITableViewControllerUIViewController都继承自它,如下所示:

class SuperClassTest {

    var stringOne:String?
    var stringTwo:String?
}

我的问题是,当我创建一个必须包含这些字段的UIViewController时,它无法继承SuperClassTest,因为它已经从UIViewController继承而来类。

如何解决此问题?

4 个答案:

答案 0 :(得分:2)

Swift和Objective-C只是单一继承,你不能为一个类提供多个超类。

当您在声明中看到Swift代码看起来像多个超类时,您最多会看到声明中的一个名称是超类,其他名称是协议名称。

答案 1 :(得分:1)

您添加"超类"作为协议而不是:

Class MyController : UITableViewController, SuperProtocolTest { 
    ...
}

然后,您可以使用您的协议作为您要符合它的类的必要蓝图:

Class MyController : UITableViewController, SuperProtocolTest, UITextFieldDelegate, ... { 
    ...
}
据说Swift是面向协议的编程(POP)的语言,而不是OOP。你不能拥有多重继承,但你可以让你的一类符合你想要的任意数量的协议,例如:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier)!

    cell.textLabel?.text = "Test"
    cell.detailTextLabel?.text = "\(indexPath.row)"

    if(cell.imageView != nil){
        cell.imageView?.image = UIImage(named: "avatar")
        cell.imageView?.layer.cornerRadius =  cell.imageView!.frame.size.height/2
        cell.imageView?.layer.masksToBounds = true

    }


    return cell
}

答案 2 :(得分:1)

如前所述:您只能继承一个类,但可以符合您希望的任意数量的协议。

显而易见的解决方案是创建一个包含所有必需变量并符合该协议的协议:

protocol ImportantPropertiesToHave {
    var stringOne : String? { get }
    var stringTwo : String? { get set }
}

class MyClass : UIViewController, ImportantPropertiesToHave {
    let stringOne : String? = "hi"
    var stringTwo : String? = nil
}

您必须在协议中指定它是只读变量还是读写变量。然后,您在实现中定义的变量必须至少与该条件匹配。

如果协议至少为get,那么您的实现可以选择将其作为公共变量。但是,如果协议希望它get set,则您的实现不得使用let,但必须使用var

答案 3 :(得分:1)

您无法在Objective C和Swift中实现多重继承。但是你可以通过多级继承实现这一点。

class SuperClassViewController : UIViewController
{
    var stringOne:String?
    var stringTwo:String?
}

class YourViewController : SuperClassViewController
{
}