Swift: переопределить класс свойств - PullRequest
0 голосов
/ 29 июня 2018

С помощью быстрых протоколов, расширений и ограничений я хочу сделать две вещи:

  1. Создание базового абстрактного класса
  2. Свойство подкласса и переопределения.

    class PropertyBase { }
    
    class PropA : PropertyBase {}
    
    class PropB : PropertyBase {}
    
    class ControllerBase {
        var prop: PropertyBase?
    }
    
    class ControllerA : ControllerBase{
        override var prop: PropA?
    }
    class ControllerB : ControllerBase{
        override var prop: PropB?
    }
    

Ошибка:

Невозможно переопределить изменяемое свойство 'prop' типа 'PropertyBase?' с ковариантным типом 'PropA?

Было бы здорово узнать, как мне добиться этого с помощью другого подхода?

EDIT

Я хотел бы добавить к этому вопросу с большей ясностью то, чего я хочу достичь.

В этом примере я создаю протокол, который имеет дело с неизвестным типом объекта. Все, что я знаю, это то, что тип может быть String или Int или совершенно другим классом Resource. Я хочу поддержать эти классы разных типов, добавив расширения. По крайней мере, это то, что я думал, что правильный подход будет, но

public protocol InstrumentProtocol : class  {
    associatedtype Item: AnyObject
    var item: Item? { get set }
    var identifier: String? { get }
}
public class AbstractBase : InstrumentProtocol {

    public var item: AnyObject?
    public var identifier: String?
    public init(_ i : AnyObject) {
        item = i
    }
    public func about() {
        print(self.item) // Any Object
    }
}

//// This is what I want to achieve, but it doesn't work
public extension InstrumentProtocol where Self.Item : Instrument {

    public func about() {
        print(self.item) //Should be of Instrument type
    }
}

 public extension InstrumentProtocol where Self.Item : String {

    public func about() {
        print(self.item) //Should be of String type
    }
}

Тип свойства item мне неизвестен. В этом случае, был бы наилучшим подходом?

1 Ответ

0 голосов
/ 29 июня 2018

Вы можете сделать что-то вроде этого:

class PropertyBase { }
class PropA : PropertyBase {}
class PropB : PropertyBase {}

protocol ControllerBaseType {
  associatedtype T: PropertyBase    
  var prop : T? { get set }
}

class ControllerA : ControllerBaseType {
  var prop: PropA?
}
class ControllerB : ControllerBaseType {
  var prop: PropB?
}

ControllerBaseType является абстрактным, как вы хотите, и у вас есть конкретная реализация prop в каждом подклассе

EDIT: Согласно комментарию @Honey, я упростил код, удалив псевдонимы типов из подклассов

EDIT2: Если вам действительно нужен ControllerBase как класс, вы можете сделать это следующим образом:

class ControllerBase<T: PropertyBase> {
  var prop : T?
}

class PropertyBase { }
class PropA : PropertyBase {}
class PropB : PropertyBase {}

class ControllerA : ControllerBase<PropA> {}
class ControllerB : ControllerBase<PropB> {}
...