дать пользовательскому классу стандартный тип, но возможность добавлять другие типы - PullRequest
0 голосов
/ 26 октября 2018

У меня есть протокол (EasyPosTypes), который содержит все типы, которые должны иметь возможность присваиваться переменным.

protocol EasyPosTypes { }
protocol EasyPosStandardTypes { }

extension EPPercentage: EasyPosTypes { }
extension Int: EasyPosTypes, EasyPosStandardTypes { }
extension CGFloat: EasyPosTypes, EasyPosStandardTypes { }
extension Double: EasyPosTypes, EasyPosStandardTypes { }
extension Float: EasyPosTypes, EasyPosStandardTypes { }

Тогда у меня есть Переменные, x и y должны быть в состоянии бытьтипы, определенные выше (EasyPosTypes):

struct FrameComponent {
    var screenWidth = UIScreen.main.bounds.width
    var screenHeight = UIScreen.main.bounds.height

    var width: CGFloat = 0.0
    var height: CGFloat = 0.0

    var x: EasyPosTypes = 0.0
    var y: EasyPosTypes = 0.0
    var percentX: CGFloat = -1
    var percentY: CGFloat = -1
}

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

И здесь я хочу проверить типы.Для всех, кроме EPPercent, я хочу запустить код в операторе if, а для EPPercent я хочу запустить on в другом if:

extension EasyPos where Self: UIView {
    func update() {
        if let xFloat = fc.x as? EasyPosStandardTypes {
            frame = CGRect(x: CGFloat(xFloat), y: frame.minY, width: frame.width, height: frame.height)
        } else if let xPercent = fc.x as? EPPercent {
            frame = CGRect(x: fc.screenWidth * CGFloat(xPercent) - frame.width / 2, y: frame.minY, width: frame.width, height: frame.height)
        }
    }
}

Код в if выдает следующую ошибку:

"Невозможно вызвать инициализатор для типа 'CGFloat' со списком аргументов типа '(EasyPosStandardTypes)'"

Код в другом:

"Невозможно вызвать инициализатор для типа 'CGFloat' со списком аргументов типа '(EPPercent)'"

1 Ответ

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

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

protocol EasyPosStandardTypes {
    var asCGFloat:  CGFloat { get }
}

extension Int: EasyPosTypes, EasyPosStandardTypes {
    var asCGFloat:  CGFloat { return CGFloat(self) }
}
extension CGFloat: EasyPosTypes, EasyPosStandardTypes {
    var asCGFloat:  CGFloat { return self }
}
extension Double: EasyPosTypes, EasyPosStandardTypes {
    var asCGFloat:  CGFloat { return CGFloat(self) }
}
extension Float: EasyPosTypes, EasyPosStandardTypes {
    var asCGFloat:  CGFloat { return CGFloat(self) }
} 

И после этого вы можете использовать это новое свойство, когда вам нужно получить значение CGFloat для типов, которые соответствуют EasyPosStandardTypesпротокол.

if let xFloat = fc.x as? EasyPosStandardTypes {
    frame = CGRect(x: xFloat.asCGFloat, y: frame.minY, width: frame.width, height: frame.height)
} // ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...