【问题标题】:give a custom class a standard type but the possibility to add other types为自定义类提供标准类型,但可以添加其他类型
【发布时间】:2019-03-31 06:08:21
【问题描述】:

我有一个协议 (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 我想在 else if 中运行 on:

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 中的代码给出以下错误:

“无法使用类型为 '(EasyPosStandardTypes)' 的参数列表调用类型 'CGFloat' 的初始化程序”

else中的代码:

“无法使用类型为 '(EPPercent)' 的参数列表调用类型为 'CGFloat' 的初始化程序”

【问题讨论】:

  • 你不想改用 typealias 吗?

标签: ios swift class types


【解决方案1】:

您可以修改您的协议,添加 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) }
} 

之后,当您需要从符合 EasyPosStandardTypes 协议的类型中获取 CGFloat 值时,您可以使用此新属性。

if let xFloat = fc.x as? EasyPosStandardTypes {
    frame = CGRect(x: xFloat.asCGFloat, y: frame.minY, width: frame.width, height: frame.height)
} // ...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-28
    • 1970-01-01
    • 2017-09-19
    相关资源
    最近更新 更多