Альтернатива наследованию от нескольких классов swift - PullRequest
0 голосов
/ 24 октября 2018

У меня есть класс, который управляет позиционированием элементов UIKit, используя 'frame':

class EasyPos: UIView {
    var screenWidth = UIScreen.main.bounds.width
    var screenHeight = UIScreen.main.bounds.height

    var x: CGFloat = 0          { didSet { self.updateFrame() } }
    var y: CGFloat = 0          { didSet { self.updateFrame() } }
    var width: CGFloat = 0      { didSet { self.updateFrame() } }
    var height: CGFloat = 0     { didSet { self.updateFrame() } }

    func updateFrame() {
        frame = CGRect(x: x, y: y, width: width, height: height)

        if x < 0 {
            frame = CGRect(x: screenWidth - abs(x) - width, y: frame.minY, width: frame.width, height: frame.height)
        }
        if y < 0 {
            frame = CGRect(x: frame.minX, y: screenHeight - abs(y) - height, width: frame.width, height: frame.height)
        }
    }

    required init(x: CGFloat = 0, y: CGFloat = 0, width: CGFloat = 40, height: CGFloat = 40) {

        self.x = x
        self.y = y
        self.width = width
        self.height = height

        super.init(frame: .zero)

        updateFrame()
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

Теперь я хочу добавить один класс, который наследует от UIbutton, и один, который наследует от UILabel.И они оба должны иметь возможность использовать методы из класса EasyPos.Как мне это сделать?(Я пробовал наследование от двух классов, не работало)

Я знаю, что это как-то связано с протоколами.Но я не мог заставить это работать.

Спасибо за вашу помощь;)

1 Ответ

0 голосов
/ 24 октября 2018

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

struct FrameComponent {
    var x: CGFloat = 0         
    var y: CGFloat = 0          
    var width: CGFloat = 0      
    var height: CGFloat = 0
}

protocol EasyPos {
    var fc: FrameComponent { get, set }
    func updateFrame()
}

extension EasyPos where Self: UIView {
     func updateFrame() {
        frame = CGRect(x: fc.x, y: fc.y, width: fc.width, height: fc.height)

        if fc.x < 0 {
            frame = CGRect(x: screenWidth - abs(fc.x) - fc.width, y: frame.minY, width: 
              frame.width, height: frame.height)
        }
        if fc.y < 0 {
            frame = CGRect(x: frame.minX, y: screenHeight - abs(fc.y) - fc.height, width: 
              frame.width, height: frame.height)
        }
    }
}

Что вы должны помнить, так это то, что расширения не могут добавлять наблюдатели свойств, поэтому вам нужно будет вызвать updateFrame() вручную.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...