编辑代码

import UIKit

class CoreGraphUIView : UIView{
     override func touchesBegan(_touches:Set<UITouch>, with event: UIEvent?){
         self.backgroundColor= UIColor.red
         print("Brgan:\(touches)")
     }
      override func touchesEnded(_touches:Set<UITouch>,with event: UIEvent?){
          self.backgroundColor= UIColor.red
          print("Began:\(touches)")
      }

      override func touchesMoved(_touches: Set<UITouch>,with event: UIEvent?){
          self.backgroundColor = UIColor.lightGray
          print("Ended:\(touches)")
      }
}

class ViewController:UIViewController{

    override func viewDidLoad(){
        super.viewDidLoad()
       // Do any additional aetup after loading the view.
       let height = self.view.frame.size.height
       let width= self.view.frame.size.width
       let graphFrame =CGRect(x:0,y:0,width: width,height: height)
       let grapView =  CoreGraphUIView(frame: graphFrame)
       graphView.backgroundColor =UIColor.white
       self.view.addSubview(graphView)
    }
}
//5.2.1 定义一个Shape类
class Shape{
    //名称
    var name  :  String?
    //边数
    var sides  : Int?
    //左上角的位置坐标
    var origin   : CGPoint?
    //线条颜色
    var lineColor  :  UIColor= UIColor.red
    //填充颜色
    var fillColor : UIColor=UIColor.green
    //线条宽度
    var lineWidth :   CGPLoat=2
    //构造器函数init
    init(name : String, sides:Int,origin: CGPoint){
        self.naem=name
        self.sides=sides
        self.origin=origin
    }
    //自定义方法sayHello
    func sayHello(){
        print("Shape is \(name!),sides \(sides!),and originCord is (\origin!.x),\(origin!.y)")
    }
}


//5.2.2 实例化Shape类
//
import UIKit

class Shape{
    //名称
    var name :  String?
    //边数
     var sides  : Int?
    //左上角的位置坐标
    var origin   : CGPoint?
    //线条颜色
    var lineColor  :  UIColor= UIColor.red
    //填充颜色
    var fillColor : UIColor=UIColor.green
    //线条宽度
    var lineWidth :   CGPLoat=2
    //构造器函数init
    init(name : String, sides:Int,origin: CGPoint){
        self.naem=name
        self.sides=sides
        self.origin=origin
    }
    //自定义方法sayHello
    func sayHello(){
        print("Shape is \(name!),sides \(sides!),and originCord is (\origin!.x),\(origin!.y)")
    }
}

class  ViewController: UIViewController{
    override func viewDidLoad(){
        super.viewDidLoad()
        //Do any additional setup after loading the view.
        //此处调用Shape类,建立一个对象(实例)myShaple
        let myShape =Shape(name:"BaseShape",sides:0, origin: CGPoint(x: 0,y:0))
        myShape.sayHello()
    }
}


//5.2.3 重载UIView中的Draw函数
import UIKit

class Shape{
    //名称
    var name: String?
    //边数
       var sides  : Int?
    //左上角的位置坐标
    var origin   : CGPoint?
    //线条颜色
    var lineColor  :  UIColor= UIColor.red
    //填充颜色
    var fillColor : UIColor=UIColor.green
    //线条宽度
    var lineWidth :   CGPLoat=2
    //构造器函数init
    init(name : String, sides:Int,origin: CGPoint){
        self.naem=name
        self.sides=sides
        self.origin=origin
    }
    //自定义方法sayHello
    func sayHello(){
        print("Shape is \(name!),sides \(sides!),and originCord is (\origin!.x),\(origin!.y)")
    }
}

class CzfView: UIView{
    //成员变量(属性)shape,其类型为Shape
    var shape : Shape?
    //重载UIView的draw方法
    override func draw(_rect: CGRect){
        //判断shape变量是否为空值nil
        guard let s =shape else{
            return
        }
        //不为空,则调用shape这个实力方法
        s.sayHello()
    }
}

class ViewController: UIViewController{
     
     override func viewDidLoad(){
         super.viewDidLoad()
         //Do any additional step after loading the view, typically  from a nib.
         //此处建立了一个CzfView的实例myShape
         let myShape =Shape(name:"BaseShape",sides: 0,origin: CGPoint(x: 0, y: 0) )


     }
     import UIKit

class Shape{
    //名称
    var name :  String?
    //边数
     var sides  : Int?
    //左上角的位置坐标
    var origin   : CGPoint?
    //线条颜色
    var lineColor  :  UIColor= UIColor.red
    //填充颜色
    var fillColor : UIColor=UIColor.green
    //线条宽度
    var lineWidth :   CGPLoat=2
    //构造器函数init
    init(name : String, sides:Int,origin: CGPoint){
        self.naem=name
        self.sides=sides
        self.origin=origin
    }
    //自定义方法sayHello
    func sayHello(){
        print("Shape is \(name!),sides \(sides!),and originCord is (\origin!.x),\(origin!.y)")
    }
}

class  ViewController: UIViewController{
    override func viewDidLoad(){
        super.viewDidLoad()
        //Do any additional setup after loading the view.
        //此处调用Shape类,建立一个对象(实例)myShaple
        let myShape =Shape(name:"BaseShape",sides:0, origin: CGPoint(x: 0,y:0))
        myShape.sayHello()
    }
}


import UIKit

class Shape{
    //名称
    var name: String?
    //边数
       var sides  : Int?
    //左上角的位置坐标
    var origin   : CGPoint?
    //线条颜色
    var lineColor  :  UIColor= UIColor.red
    //填充颜色
    var fillColor : UIColor=UIColor.green
    //线条宽度
    var lineWidth :   CGPLoat=2
    //构造器函数init
    init(name : String, sides:Int,origin: CGPoint){
        self.naem=name
        self.sides=sides
        self.origin=origin
    }
    //自定义方法sayHello
    func sayHello(){
        print("Shape is \(name!),sides \(sides!),and originCord is (\origin!.x),\(origin!.y)")
    }
}

class CzfView: UIView{
    //成员变量(属性)shape,其类型为Shape
    var shape : Shape?
    //重载UIView的draw方法
    override func draw(_rect: CGRect){
        //判断shape变量是否为空值nil
        guard let s =shape else{
            return
        }
        //不为空,则调用shape这个实力方法
        s.sayHello()
    }
}

class ViewController: UIViewController{
     
     override func viewDidLoad(){
         super.viewDidLoad()
         //Do any additional step after loading the view, typically  from a nib.
         //此处建立了一个CzfView的实例myShape
         let myShape =Shape(name:"BaseShape",sides: 0,origin: CGPoint(x: 0, y: 0) )
         //赋值给myView中的成员变量(属性)shape
         myView.shape = myShape
         //显示myView
         self.view.addSubview(myView)

     }
}

import UIKit

class Shape{
    //名称
    var name: String?
    //边数
       var sides  : Int?
    //左上角的位置坐标
    var origin   : CGPoint?
    //线条颜色
    var lineColor  :  UIColor= UIColor.red
    //填充颜色
    var fillColor : UIColor=UIColor.green
    //线条宽度
    var lineWidth :   CGPLoat=2
    //构造器函数init
    init(name : String, sides:Int,origin: CGPoint){
        self.naem=name
        self.sides=sides
        self.origin=origin
    }
    //自定义方法sayHello
    func sayHello(){
        print("Shape is \(name!),sides \(sides!),and originCord is (\origin!.x),\(origin!.y)")
    }
}

class CzfView: UIView{
    //成员变量(属性)shape,其类型为Shape
    var shape : Shape?
    //重载UIView的draw方法
    override func draw(_rect: CGRect){
        //判断shape变量是否为空值nil
        guard let s =shape else{
            return
        }
        //不为空,则调用shape这个实力方法
        s.sayHello()
    }
}

class ViewController: UIViewController{
     
     override func viewDidLoad(){
         super.viewDidLoad()
         //Do any additional step after loading the view, typically  from a nib.
         //此处建立了一个CzfView的实例myShape
         let myShape =Shape(name:"BaseShape",sides: 0,origin: CGPoint(x: 0, y: 0) )
         //赋值给myView中的成员变量(属性)shape
         myView.shape = myShape
         //显示myView
         self.view.addSubview(myView)

     }
}

//5.4.4项目实现
import UIKit
import Foundation
import AVFoundation

class Shape {
    //名称
    var name : String?
    //声音播放器
    var soundPlayer : AVAudioPlayer?
    //声音文件名称
    var soundFile : String?
    var path : UIBezierPath?
    var selectedFlay : Bool =false
    //左上角的位置坐标
    var origin : CGPoint?
    //线条颜色
    var lineColor : UIColor? = UIColor.red、
    //填充颜色
    var fillColor : UIColor? = UIColor.green
    //线条宽度
    var lineWidth : CGFloat? =5
    //构造器函数init
    init (name :String, origin :CGPoint,soundFile: String="DO.m4a"){
        self.name=name
        self.origin=origin
        self.soundFile=soundFile
    }
    //便利构造器函数init
    convenience init(origin : CGPoint){
        self.init(name :"Shape Bassclass", origin : origin)
    }
    //自定义方法drawBezierPath用于画图
    func drawBezierPath(){
        //向控制台输出信息
        print("Draw \(name!)")
    }
    func playAudio(){
        print("Play sound:\(soundFile!)")
        let path = Bundle.main.path(forResource: soundFile, ofType: nil)
        let url =URL(fileURLWithPath: path!)
        soundPlayer =try? AVAudioPlayer(conventsOf: url)
        soundPlayer?.play()
    }
    func isSelected(point : CGPoint) -> Bool{
        if (path?. contains(point))!{
            selectedFlag =true
            return true
        }
        else{
            selectedFlag = false
            return false
        }
    }
}

class Line : Shape{
    //线段的起点
    var start : CGPoint?
    var end : CGPoint?
    init(name: String, origin : CGPoint, start: CGPoint,end: CGPoint,soundFile: String ="FA.m4a"){
        super.init(name: name, origin: origin, soundFile:soundFile)
        self.start=start
        self.end=end
    }
    convenience init(start : CGPoint, end :CGPoint){
        self.init(name:"Line",origin: start,start:start,end:end)
    }
    override func drawBezierPath(){
        print("Draw\(name!)")
        path = UIBezierPath()
        path?.move(to:start!)
        path?.addLine(to:end!)
        path?.lineWidth=lineWidth!
        path?.lineCapStyle= .round
        lineColor?.setSteoke()
        path?.stroke()
    }
}
class Rectangle: Shape{
    var size: CGSzie?
    var corner : CGFloat?
    init(name: String,origin : CGPoint,size :CGSzie,corner :CGFloat,soundFile:String="la.m4a"){
        super.init(name:name,origin:origin,soundFile: soundFile)
        self.size=size
        self.corner =corner
    }
    convenience init(name: "Rectangle",origin:origin,size: size, corner: corner)
}
override func drawBezierPath(){
    print("Draw\(name!)")
    path=UIBezierPath(roundedRect: CGRect(origin: origin!,size:size!), cornerRadius: corner!)
    if selectedFlag{
        let dashes :[CGFloat] =lineWidth!
        lineColor?.setSteoke()
        path?.stroke()
    }
}
class Circle : Shape{
    var center : CGPoint?
    var raduis :CGFloat?
    var size: CGSzie?
    init(name:String,origin : CGPoint,center: CGPoint, raduis :CGFloat, size:CGSzie,soundFile: String="MI.m4a"){
        super.init(name:name,origin:origin,soundFile:soundFile)
        self.center=center
        self.raduis=raduis
        self.size=size
    }
    convenience init(center: CGPoint,raduis :CGFloat){
        let x=center.x-raduis
        let y=center.y-raduis
        self.init(name:"Circle",origin:CGPoint(x:x,y:y),center:center,raduis:raduis,size:CGSzie(width:raduis,height:raduis))
    }
    convenience init(center: CGPoint,size: CGSzie){
        let x=center.x-size.width/2
        let y= center.y-size.height/2
        self.init(name:"Oval/Ellipse", origin: CGPoint(x:x,y:y),center:center, raduis:0,size:size)
    }
    override func drawBezierPath(){
        print("Draw\(name!)")
        path= UIBezierPath(OvalIn:CGRect(origin:origin!, size:size!))
        if selectedFlag{
            let dashes: [CGFloat]=[1,3]
            path?.setLineDash(dashes,count: dashes.count,phase:0)
        }
        path?.lineWidth=lineWidth!
        lineColor?.setSteoke()
        path?.stroke()
            }
}

class Polygons : Shape{
    var points: Array<CGPoint>?
    init(name:String,origin:CGPoint,soundFile:soundFile:soundFile)
    self.points=points
}                     
convenience init(points :Array<CGPoint>){
    if points.count ==3{
        self.init(name: "Polygons", origin:points.first!, points:points)
    }
    else if points.count >=3{
        self.init(name:"Polygons", origin: points.first!, points:points)
    }
    else{
        let origin = CGPoint(x:0,y:0)
        self.init(name:"Error", origin:origin,points:points)
    }
}
override func drawBezierPath(){
    print("Draw \(name!)")
    if(name=="Error"){
        return
    }
    path= UIBezierPath()
    path?.move(to:each)
}                            
path?.close()
path?.lineWidth= lineWidth!
lineColor?.setSteoke()
path?.fill()
}
}
class FiveStar : Shape{
    var center : CGPoint?
    var raduis : CGFloat?
    var angle :CGFloat?
    init(name: String,origin:CGPoint,center : CGPoint,raduis :CGFloat,angel :
    CGFloat,soundFile:String="SO.m4a"){
        super.init(name:name,origin:origin,soundFile:soundFile)
        self.center=center
        self.raduis=raduis
        self.angel=angel
    }
    convenience init(center : CGPoint, raduis :CGFloat,angel:CGFloat=0){
        let x=center.x-raduis
        let y=center.y-raduis
        self.init(name:"FiveStar", origin:CGPoint(x:x,y:y),center:center,raduis:raduis,angel:angel)
    }

    //自定义drawBezierPath用于画五角星
    override func drawBezierPath(){
        //向控制台输出信息
        print("Draw\()name!")
        //调用贝塞尔曲线函数UIBezierPath()
        path = UIBezierPath
        //五角星旋转顶点
        let i =360/qngel!
        let xzAngle = CGFloat.pi*2/i
        let xzX = (center?.x)! - sin(xzAngle)*raduis!
        let xzY = (center?.y)! - sin(xzAngle)*raduis!
        let p1 = CGPoint(x: xzX, y: xzy)
        path?.move(to: p1)
        let angle = CGPoint.pi*4/5
        for i in 1...5 {
            let x = (center?.x)! - sin(CGFloat(i)*angle+xzAngle)*raduis!
            let y = (center?.y)! - cos(CGFloat(i)*angle+xzAngle)*raduis!
            path?.addLine(to: CGFloat(x: x,y: y))
        }
        path?.close()
        if  selectedFlag{
            let dashes:[CGFloat] = [1,3]
            path?. setLineDash(dashes,count: dashes.count,phase: 0)
        }
        //线条宽度
        path?.lineWidth = lineWidth!
        //线条颜色为red红色
        lineColor?.setSteoke()
        //画出这个圆
        path?.stroke()
    }
}        
class CzfView : UIView {
    //成员变量(属性) shapes,其类型为Array<Shape>
    private var shapes : Array<Shape> = []
    //重载UIView的draw方法
    override func draw(_rect: CGRect) {
        //调用shapees这个数组中的每个实例的方法
        for s in shapes {
            s.drawBezierPath()
        }
    }
    //增加实例到数组shapes中
    func add(shape : Shape) {
        Shapes.append(shape)
    }
    //触摸事件
    override func touchesBegann(_touches: Set<UITouch>,with event:UIEvent?) {
        //获得UITouch集合
        let touch:UITouch = touches.first! as UITouch

        //获得触摸所在位置的坐标
        let point = touch.location(in: self)
        //调用shapes这个数组中的每个实例的方法
        for s in shapes {
            //如果被选中
            if s.isSelected(point: point) {
                //声音播放
                s.playAudio()
                self.setNeedsDisplay()
            }
        }
    }
}       
class ViewController: UIViewController {

    override func ViewController() {
        super.ViewController()
        //Do any additional setup after loading the view,typically from a nib.
        //此次调用FiveStar类,建立一个对象(实例)star
        //五角星的中心坐标为(180,180)
        let starCenter = CGPoint(x: 180,y: 180)
        //五角星的半径设定
    }
    
}
import UIKit

class CoreGraphUIView : UIView{
     override func touchesBegan(_touches:Set<UITouch>, with event: UIEvent?){
         self.backgroundColor= UIColor.red
         print("Brgan:\(touches)")
     }
      override func touchesEnded(_touches:Set<UITouch>,with event: UIEvent?){
          self.backgroundColor= UIColor.red
          print("Began:\(touches)")
      }

      override func touchesMoved(_touches: Set<UITouch>,with event: UIEvent?){
          self.backgroundColor = UIColor.lightGray
          print("Ended:\(touches)")
      }
}

class ViewController:UIViewController{

    override func viewDidLoad(){
        super.viewDidLoad()
       // Do any additional aetup after loading the view.
       let height = self.view.frame.size.height
       let width= self.view.frame.size.width
       let graphFrame =CGRect(x:0,y:0,width: width,height: height)
       let grapView =  CoreGraphUIView(frame: graphFrame)
       graphView.backgroundColor =UIColor.white
       self.view.addSubview(graphView)
    }
}




5.2 拥有自己的绘画类




//5.2.1 定义一个Shape类
class Shape{
    //名称
    var name  :  String?
    //边数
    var sides  : Int?
    //左上角的位置坐标
    var origin   : CGPoint?
    //线条颜色
    var lineColor  :  UIColor= UIColor.red
    //填充颜色
    var fillColor : UIColor=UIColor.green
    //线条宽度
    var lineWidth :   CGPLoat=2
    //构造器函数init
    init(name : String, sides:Int,origin: CGPoint){
        self.naem=name
        self.sides=sides
        self.origin=origin
    }
    //自定义方法sayHello
    func sayHello(){
        print("Shape is \(name!),sides \(sides!),and originCord is (\origin!.x),\(origin!.y)")
    }
}


//5.2.2 实例化Shape类
//
import UIKit

class Shape{
    //名称
    var name :  String?
    //边数
     var sides  : Int?
    //左上角的位置坐标
    var origin   : CGPoint?
    //线条颜色
    var lineColor  :  UIColor= UIColor.red
    //填充颜色
    var fillColor : UIColor=UIColor.green
    //线条宽度
    var lineWidth :   CGPLoat=2
    //构造器函数init
    init(name : String, sides:Int,origin: CGPoint){
        self.naem=name
        self.sides=sides
        self.origin=origin
    }
    //自定义方法sayHello
    func sayHello(){
        print("Shape is \(name!),sides \(sides!),and originCord is (\origin!.x),\(origin!.y)")
    }
}

class  ViewController: UIViewController{
    override func viewDidLoad(){
        super.viewDidLoad()
        //Do any additional setup after loading the view.
        //此处调用Shape类,建立一个对象(实例)myShaple
        let myShape =Shape(name:"BaseShape",sides:0, origin: CGPoint(x: 0,y:0))
        myShape.sayHello()
    }
}


//5.2.3 重载UIView中的Draw函数
import UIKit

class Shape{
    //名称
    var name: String?
    //边数
       var sides  : Int?
    //左上角的位置坐标
    var origin   : CGPoint?
    //线条颜色
    var lineColor  :  UIColor= UIColor.red
    //填充颜色
    var fillColor : UIColor=UIColor.green
    //线条宽度
    var lineWidth :   CGPLoat=2
    //构造器函数init
    init(name : String, sides:Int,origin: CGPoint){
        self.naem=name
        self.sides=sides
        self.origin=origin
    }
    //自定义方法sayHello
    func sayHello(){
        print("Shape is \(name!),sides \(sides!),and originCord is (\origin!.x),\(origin!.y)")
    }
}

class CzfView: UIView{
    //成员变量(属性)shape,其类型为Shape
    var shape : Shape?
    //重载UIView的draw方法
    override func draw(_rect: CGRect){
        //判断shape变量是否为空值nil
        guard let s =shape else{
            return
        }
        //不为空,则调用shape这个实力方法
        s.sayHello()
    }
}

class ViewController: UIViewController{
     
     override func viewDidLoad(){
         super.viewDidLoad()
         //Do any additional step after loading the view, typically  from a nib.
         //此处建立了一个CzfView的实例myShape
         let myShape =Shape(name:"BaseShape",sides: 0,origin: CGPoint(x: 0, y: 0) )
         //赋值给myView中的成员变量(属性)shape
         myView.shape = myShape
         //显示myView
         self.view.addSubview(myView)

     }
}



5.4 奏响乐队凯歌


//5.4.4项目实现
import UIKit
import Foundation
import AVFoundation

class Shape {
    //名称
    var name : String?
    //声音播放器
    var soundPlayer : AVAudioPlayer?
    //声音文件名称
    var soundFile : String?
    var path : UIBezierPath?
    var selectedFlay : Bool =false
    //左上角的位置坐标
    var origin : CGPoint?
    //线条颜色
    var lineColor : UIColor? = UIColor.red、
    //填充颜色
    var fillColor : UIColor? = UIColor.green
    //线条宽度
    var lineWidth : CGFloat? =5
    //构造器函数init
    init (name :String, origin :CGPoint,soundFile: String="DO.m4a"){
        self.name=name
        self.origin=origin
        self.soundFile=soundFile
    }
    //便利构造器函数init
    convenience init(origin : CGPoint){
        self.init(name :"Shape Bassclass", origin : origin)
    }
    //自定义方法drawBezierPath用于画图
    func drawBezierPath(){
        //向控制台输出信息
        print("Draw \(name!)")
    }
    func playAudio(){
        print("Play sound:\(soundFile!)")
        let path = Bundle.main.path(forResource: soundFile, ofType: nil)
        let url =URL(fileURLWithPath: path!)
        soundPlayer =try? AVAudioPlayer(conventsOf: url)
        soundPlayer?.play()
    }
    func isSelected(point : CGPoint) -> Bool{
        if (path?. contains(point))!{
            selectedFlag =true
            return true
        }
        else{
            selectedFlag = false
            return false
        }
    }
}

class Line : Shape{
    //线段的起点
    var start : CGPoint?
    var end : CGPoint?
    init(name: String, origin : CGPoint, start: CGPoint,end: CGPoint,soundFile: String ="FA.m4a"){
        super.init(name: name, origin: origin, soundFile:soundFile)
        self.start=start
        self.end=end
    }
    convenience init(start : CGPoint, end :CGPoint){
        self.init(name:"Line",origin: start,start:start,end:end)
    }
    override func drawBezierPath(){
        print("Draw\(name!)")
        path = UIBezierPath()
        path?.move(to:start!)
        path?.addLine(to:end!)
        path?.lineWidth=lineWidth!
        path?.lineCapStyle= .round
        lineColor?.setSteoke()
        path?.stroke()
    }
}
class Rectangle: Shape{
    var size: CGSzie?
    var corner : CGFloat?
    init(name: String,origin : CGPoint,size :CGSzie,corner :CGFloat,soundFile:String="la.m4a"){
        super.init(name:name,origin:origin,soundFile: soundFile)
        self.size=size
        self.corner =corner
    }
    convenience init(name: "Rectangle",origin:origin,size: size, corner: corner)
}
override func drawBezierPath(){
    print("Draw\(name!)")
    path=UIBezierPath(roundedRect: CGRect(origin: origin!,size:size!), cornerRadius: corner!)
    if selectedFlag{
        let dashes :[CGFloat] =lineWidth!
        lineColor?.setSteoke()
        path?.stroke()
    }
}
class Circle : Shape{
    var center : CGPoint?
    var raduis :CGFloat?
    var size: CGSzie?
    init(name:String,origin : CGPoint,center: CGPoint, raduis :CGFloat, size:CGSzie,soundFile: String="MI.m4a"){
        super.init(name:name,origin:origin,soundFile:soundFile)
        self.center=center
        self.raduis=raduis
        self.size=size
    }
    convenience init(center: CGPoint,raduis :CGFloat){
        let x=center.x-raduis
        let y=center.y-raduis
        self.init(name:"Circle",origin:CGPoint(x:x,y:y),center:center,raduis:raduis,size:CGSzie(width:raduis,height:raduis))
    }
    convenience init(center: CGPoint,size: CGSzie){
        let x=center.x-size.width/2
        let y= center.y-size.height/2
        self.init(name:"Oval/Ellipse", origin: CGPoint(x:x,y:y),center:center, raduis:0,size:size)
    }
    override func drawBezierPath(){
        print("Draw\(name!)")
        path= UIBezierPath(OvalIn:CGRect(origin:origin!, size:size!))
        if selectedFlag{
            let dashes: [CGFloat]=[1,3]
            path?.setLineDash(dashes,count: dashes.count,phase:0)
        }
        path?.lineWidth=lineWidth!
        lineColor?.setSteoke()
        path?.stroke()
            }
}

class Polygons : Shape{
    var points: Array<CGPoint>?
    init(name:String,origin:CGPoint,soundFile:soundFile:soundFile)
    self.points=points
}                     
convenience init(points :Array<CGPoint>){
    if points.count ==3{
        self.init(name: "Polygons", origin:points.first!, points:points)
    }
    else if points.count >=3{
        self.init(name:"Polygons", origin: points.first!, points:points)
    }
    else{
        let origin = CGPoint(x:0,y:0)
        self.init(name:"Error", origin:origin,points:points)
    }
}
override func drawBezierPath(){
    print("Draw \(name!)")
    if(name=="Error"){
        return
    }
    path= UIBezierPath()
    path?.move(to:each)
}                            
path?.close()
path?.lineWidth= lineWidth!
lineColor?.setSteoke()
path?.fill()
}
}
class FiveStar : Shape{
    var center : CGPoint?
    var raduis : CGFloat?
    var angle :CGFloat?
    init(name: String,origin:CGPoint,center : CGPoint,raduis :CGFloat,angel :
    CGFloat,soundFile:String="SO.m4a"){
        super.init(name:name,origin:origin,soundFile:soundFile)
        self.center=center
        self.raduis=raduis
        self.angel=angel
    }
    convenience init(center : CGPoint, raduis :CGFloat,angel:CGFloat=0){
        let x=center.x-raduis
        let y=center.y-raduis
        self.init(name:"FiveStar", origin:CGPoint(x:x,y:y),center:center,raduis:raduis,angel:angel)
    }

    //自定义drawBezierPath用于画五角星
    override func drawBezierPath(){
        //向控制台输出信息
        print("Draw\()name!")
        //调用贝塞尔曲线函数UIBezierPath()
        path = UIBezierPath
        //五角星旋转顶点
        let i =360/qngel!
        let xzAngle = CGFloat.pi*2/i
        let xzX = (center?.x)! - sin(xzAngle)*raduis!
        let xzY = (center?.y)! - sin(xzAngle)*raduis!
        let p1 = CGPoint(x: xzX, y: xzy)
        path?.move(to: p1)
        let angle = CGPoint.pi*4/5
        for i in 1...5 {
            let x = (center?.x)! - sin(CGFloat(i)*angle+xzAngle)*raduis!
            let y = (center?.y)! - cos(CGFloat(i)*angle+xzAngle)*raduis!
            path?.addLine(to: CGFloat(x: x,y: y))
        }
        path?.close()
        if  selectedFlag{
            let dashes:[CGFloat] = [1,3]
            path?. setLineDash(dashes,count: dashes.count,phase: 0)
        }
        //线条宽度
        path?.lineWidth = lineWidth!
        //线条颜色为red红色
        lineColor?.setSteoke()
        //画出这个圆
        path?.stroke()
    }
}        
class CzfView : UIView {
    //成员变量(属性) shapes,其类型为Array<Shape>
    private var shapes : Array<Shape> = []
    //重载UIView的draw方法
    override func draw(_rect: CGRect) {
        //调用shapees这个数组中的每个实例的方法
        for s in shapes {
            s.drawBezierPath()
        }
    }
    //增加实例到数组shapes中
    func add(shape : Shape) {
        Shapes.append(shape)
    }
    //触摸事件
    override func touchesBegann(_touches: Set<UITouch>,with event:UIEvent?) {
        //获得UITouch集合
        let touch:UITouch = touches.first! as UITouch

        //获得触摸所在位置的坐标
        let point = touch.location(in: self)
        //调用shapes这个数组中的每个实例的方法
        for s in shapes {
            //如果被选中
            if s.isSelected(point: point) {
                //声音播放
                s.playAudio()
                self.setNeedsDisplay()
            }
        }
    }
}       
class ViewController: UIViewController {
    
}