Swift-Diagram-Playgrounds, 使用递归 enum 数据结构,绘制图表

分享于 

4分钟阅读

GitHub

  繁體 雙語
Drawing diagrams in Swift using a recursive enum data structure
  • 源代码名称:Swift-Diagram-Playgrounds
  • 源代码网址:http://www.github.com/alskipp/Swift-Diagram-Playgrounds
  • Swift-Diagram-Playgrounds源代码文档
  • Swift-Diagram-Playgrounds源代码下载
  • Git URL:
    git://www.github.com/alskipp/Swift-Diagram-Playgrounds.git
    Git Clone代码到本地:
    git clone http://www.github.com/alskipp/Swift-Diagram-Playgrounds
    Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/alskipp/Swift-Diagram-Playgrounds
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
    
    Swift-Diagram-Playgrounds

    Swift 3.0

    这是苹果公司在Swift中针对面向协议编程的苹果代码示例的改编。

    包含了苹果示例游乐场文件 Crustacean.playground的原始版本,它使用 Protocol-oriented 设计( 已经更新为 Swift 3 )。 另外还有另一个版本 CrustaceanEnumOriented.playground,它使用递归 enum 作为数据结构。

    最后,Diagrams.playground 增加了一些功能,并包含了几个示例图。

    playgrounds演示了两种创建 Diagram 值作为值类型的方法,并展示了如何将它们绘制成 CGContext。

    screenshot

    苹果版本使用了多种符合 Drawable 协议的结构来代表不同的形状。 替代方法使用递归 enum 来实现相同的结果。 它看起来像这样:

    publicenumDiagram {
     casePolygon([CGPoint])
     caseLine([CGPoint])
     caseArc(radius: CGFloat, startAngle: CGFloat, endAngle: CGFloat)
     caseCircle(radius: CGFloat)
     indirectcaseScale(x: CGFloat, y: CGFloat, diagram: Diagram)
     indirectcaseTranslate(x: CGFloat, y: CGFloat, diagram: Diagram)
     indirectcaseRotate(angle: CGFloat, diagram: Diagram)
     caseDiagrams([Diagram])
    }

    注意:livePreview 将愉快地消耗处理能力以连续重绘静止图像,因此建议在图像呈现之后手动停止操场的执行。

    协议定向或者枚举定向,更好?

    这两种方法很好地演示了表达式问题的。 哪种方法更容易扩展? 使用面向协议技术允许你添加新类型而不必太麻烦。 在苹果代码示例中,通过实现 Drawable 协议和 Equatable ( 不需要调整预先现有的代码) 来添加 Bubble 结构。 如果将 Bubble 案例添加到 enum 版本,则需要更改前现有函数( 用于 DiagramdrawDiagram 函数的Equatable ),这更加麻烦和更容易。 但是,我们不需要向 enum 添加新的案例来绘制 Bubble,只需添加构造气泡并返回 Diagram的函数,在这种情况下不需要改变代码。

    使用 Renderer 协议可以更容易地将 TestRenderer 添加到日志绘图中。 但是,使用 Renderer 协议添加图转换功能可能非常麻烦。 添加一个 ScaledRenderer 类型很容易,但是添加一个 TranslateRenderer,或者是 CGContext 提供的RotateRenderer 和重复功能更加复杂。 enum 方法并不试图提供 Diagram 转换的逻辑,它只是存储需要的信息,并使用 CGContext 函数来完成硬工作。


    数据  str  Swift  Struct  DIA  结构  
    相关文章