编辑代码

var myString = "Hello world!     -  swift.jsrun.net"
print(myString)
Amor.Y:
//构造器
init (name: String, origin: CGPoint, center: CGPoint, radius: CGFloat, angel
CGFloat, soundFile: String ="SO.m4a")(
super.init (name: name,origin: origin, soundFile: soundFile)
self.center =center
self .radius = radius
self.angel = angel
import ulkit
import Foundation import
AVFoundation
class Shape 
var name :String?
var soundPlayer : AVAudioPlayer? var soundFile :String?
//UlBezierPath
var path : UlBezierPath?
//selected?
var selectedFlag:Bool=false var origin :CGPoint?
var lineColor:UIColor?=UIColor. red
var fillcolor:UIColor?=UlColor. green
var lineWidth : CGFloat?=5
init(name :string,origin :CGPoint, soundFile :String -“DO.m4a“)self.name =name
self.origin = origin
self.soundFile = soundFile
convenience init(origin :CGPoint)self.init(name:“Shape
Bassclass", origin: origin)
)

Amor.Y:
func drawBezierPath()[print(“Draw\(name!) “)
]
func playAudio()f
print("Play sound:\(soundFile!)") let path = Bundle.
mainpath(forResource: soundfile, ofType:nil) let
url=URL(fileURWithPath:path!) soundPlayer =try?
AVAudioPlayer(contentsof:url) soundPlayer?.play()
]
func isSelected(point :CGPoint) ->Boolf
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.startmstart
self.end=end
convenience init(start :CGPoint, end:CGPoint) [self.init(name:“Line“, origin: start, start: start, end: end)
]
override func drawBezierPath()f

Amor.Y:
print(“Draw\(name!) 
path = UlBezierPath()
path?.move(to: start!)
path?.addLine(to:end!)
path?.lineWidth =linewidth!
path?.lineCapStyle=.round
lineColor?.setStroke()
path?.stroke()
class Rectangle:Shapef
var size: CGSize?
var corner:CGFloat?
init(name:String,origin: CGPoint, size:CGSire, Corner:0GFloat,soundFile:
String ="LA.mda") (
super.init(name:Name,rigingin, soundFile:soundFile)
self.sizewsize
self.corner = corner
convenience init(origin: CGPoint, size:CGSize, corner:CGFloat-0)
self.init(name:“Rectangle“,origin:origin,size: size,corner :corner)]
//重载 drawBezierPath 方法画矩形或者正方形
override func drawBezierPath()f print("Draw \(name!)") [path=UlBezierPath(roundedRect: CGRect(origin: originl, size
size!),cornerRadius: corner!)
if selectedFlag 
let dashes:[CGFloat] = [1,3]
path?.setLineDash(dashescount: dashes.count, phase:0)
]
path?.lineWidth = lineWidth!
lineColor?.setstroke()

Amor.Y:
path?.stroke()
)]
class Circle:Shape 
var center:CGPoint?
var raduis :CGFloat?
var size:CGSize?
init(name:String,origin:CGPoint, center:CGPoint, raduis :CGFloat,size:
CGSize,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“,originiCGPoint(xiXry:y), center: center, raduis: raduis, Bize: CGSize(width; raduis, height; raduia))
]
convenience init(center: CGPoint, size : CGSize)(
let x=center.x-size.width/2let y =center.y - size.height/2self.init(name:"Oval/Ellipse",
origin:CGPoint(xix,y:y),center: center, raduis:0, size:size)
]
override func drawBezierPath()f print("Draw \(name!)")
path=UlBezierPath(ovalln:
CGRect(origin: origin!, size: size!)) if selectedFlag (
let dashes:[CGFloat]=[1,3]
path?.setLineDash(dashes,count: dashes.count, phase:0)
]

Amor.Y:
path?.lineWidth =lineWidth!
lineColor?.setStroke()
path?.stroke()
class Polygons :Shape [var points:Array<cgpoint>? init(name:String,origin:CGPoint, oints:Array<CGPoint>soundFile: String
="RE.m4a") [super.init(name:name,origin: origin,soundfile: soundFile) self. points =points
convenience init(points:
Array<CGPoint>)[if points.count == 3(
self.init(name:"Triangel",origin: points.first!, points:
points)
]
else if points.count >=3
self.init(name:"Polygons",origin: points.first!, points:
points)
]
else f
let origin =CGPoint(x: 0, y: 0)self.init(name:"Error",origin: origin, points:points)
]
]
override fune drawBezierPath() print("Draw \(name!)")
if(name=="Error") [return
]
path = UIBezierPath()
path?.move(to:origin!)
for each in points! (
path?.addLine(to:each

Amor.Y:
] 
path?.close()
path?.lineWidth =lineWidth!
lineColor?.setStroke()
path?.stroke()
path?.fill()
לl
class FiveStar:Shape (
var center:CGPoint?
var radius:CGFloat?
var angel:CGFloat?
init(name: String,origin: CGPoint, center:CGPoint,radius :CGFloat, angel:
CGFloat,soundFile :String="so.m4a")(
super.init(name: name,origin: origin,soundFile: soundFile)
self.center= center
self.radius = radius
self.angel = angel
]
convenience init(center: CGPoint, radiun i carlont,angel:CGrloat
=0)(
let x = center.x - radius
let y = center.y - radius
selfinit(name:"FiveStar",
origintCGPoint(uik,yiy), center: contei
radius: radius, angel: angel)
]
override func drawBezierPath()f print("Draw\(name!)")
//调用贝塞尔曲线函数
UTBezierPath()
path =UIBezierPath()
let i= 360/angel!
let xzAngle=CGFloat.pi*2/i

Amor.Y:
let xzX=(center?.x)!-
sin(xzAngle)*radius!
let xzY=(center?.y)!-
cos(xzAngle)*radius!
let p1= CGPoint(x: xzX, y; xzY) path?.move(to:pl)
let angle = CGFloat.pi*4/5
for i in 1...5 (
letx= (center?.x)! - sin(CGFloat(i)* angle+xzAngle)*radius!
let y=(center?.y)!-
cos(CGFloat(i)*angle+xzAngle)* radius!
path?.addLine(to:CGPoint(x:x,y: y))
]
path?.close()
if selectedFlagf
let dashes:[CGFloat] = [1,3]
path?.setLineDash(dashes,count: dashes.count, phase:0)
] 
path?.lineWidth =lineWidth!
//线条颜色为 red 红色
lineColor?.setStroke()
path?.stroke()
class CzfView:UlView [//成员变量(属性)shapes,其类型为Array<Shape>
private var shapes
Array<Shape>=[]
//重载 UIView  draw 方法
override func draw( rect: CGRect)[//调用 shapes这个数组中的每个实例的方法
for s in shapes (
s.drawBezierPath()
]
)

Amor.Y:
//增加实例到数组 shapes 
func add(shape :Shape)(
shapes.append(shape)
]
//触摸事件
override func touchesBegan(_ touches : Set<UlTouch>, with event:
UlEvent?) [//获得 UITouch 集合
let touch:UlTouch =touches.first! as UlTouch
//获得触摸所在位置的坐标
let point = touch.location(in: self)//调用 shapes 这个数组中的每个实例的方法
for s in shapes 
//如果被选中
if s.isSelected(point:point)
// 声音播放
s.playAudio()
//更新屏幕显示
self.setNeedsDisplay()
]IIl
class ViewController:
UIViewController(
override func viewDidLoad() super.viewDidLoad()
// Do any additional setup after loading the view,typically from a nib.
//此处调用 FiveStar类,建立一个对象(实例)star

Amor.Y:
//五角星的中心坐标为(180,180)let starCenter =CGPoint(x:180,y:180)
//五角星的半径设定了90,旋转角度为15 
let star =FiveStar(center:
starCenter,radius: 50, angel: 45star.lineColor =UlColor.blue
//此处调用 Circle 类,建立一个对象oval
let ovalCenter =CGPoint(x:100,y;300)
let ovalSize = CGSize(width:100,height:60)
let ovalmCircle(center:ovalCenter, size: ovalSize)
//此处调用 Rectangle 类,建立一个对象 rect
let rectOrigin=CGPoint(x:60,y:50)letrectSize = GSize(width: 100,height:50)
Let rect = Rectangle(origin:
rectorigin,size:rectSize,corner:6)rect.lineColor =UIColorgray
//此处建立了一个 Czfview 的实例myview
let myView =CzfView(frame:CGRect(x:0,y:0,width: self.view. frame.size width, height: self. viewframe.size.height))
//清除背景色
myView.backgroundColor=
UIColor.clear
//赋值给 myView 中的成员变量(属性)shape
myView.add(shape:star)
myView.add(shape:oval)
myView.add(shape:rect)
//显示 myView
self.view.addSubview(myView)