У меня проблема с множественным наследованием в Swift, вот моя ситуация:

В моем приложении у меня есть различные UITableViewController и UIViewController, но у обоих должны быть разные поля, например массив и две строки. По этой причине я решил создать суперкласс 'SuperClassTest' и все UITableViewController и UIViewController унаследовать от него, например:

class SuperClassTest {

    var stringOne:String?
    var stringTwo:String?
}

Моя проблема в том, что когда я создаю, например, UIViewController, который должен иметь эти поля, он не может наследовать от SuperClassTest, потому что он уже наследуется от класса UIViewController.

Как мне решить эту проблему?

0
gino gino 31 Дек 2015 в 15:01

4 ответа

Лучший ответ

Вы не можете реализовать множественное наследование в Objective C и Swift. Но этого можно добиться с помощью многоуровневого наследования.

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

class YourViewController : SuperClassViewController
{
}
1
Midhun MP 31 Дек 2015 в 13:04

Как уже было сказано: вы можете унаследовать только один класс, но можете соответствовать любому количеству протоколов.

Очевидное решение - создать протокол, содержащий все необходимые переменные, и соответствовать этому протоколу:

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.

1
luk2302 31 Дек 2015 в 12:54

Вместо этого вы добавляете свой «суперкласс» в качестве протокола:

Protocol SuperProtocolTest {

    var stringOne:String?
    var stringTwo:String?
}

Затем вы можете использовать свой протокол в качестве необходимых чертежей для классов, которым вы хотите соответствовать:

Class MyController : UITableViewController, SuperProtocolTest { 
    ...
}

Говорят, что Swift - это язык ориентированного на протокол программирования (POP), а не ООП. У вас не может быть множественного наследования, но вы можете позволить своему классу соответствовать любому количеству протоколов, например

Class MyController : UITableViewController, SuperProtocolTest, UITextFieldDelegate, ... { 
    ...
}
1
dfrib 31 Дек 2015 в 12:54

Swift и Objective-C - это только одинарное наследование, у вас не может быть более одного суперкласса для класса.

Когда вы видите код Swift с тем, что выглядит как несколько суперклассов в их объявлении, вы увидите, что самое большее, одно из имен в объявлении является суперклассом, а остальные - именами протоколов.

3
sandy 31 Дек 2015 в 12:17