У меня есть протокол (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)'"