第三周第三天
类
class Point {
var x: Double
var y: Double
// 我们可以在一个类中定义多个初始化方法
// 便利初始化方法 / 便利构造器
// 调用了其他的初始化方法的初始化方法
convenience init() {
self.init(x: 0, y: 0)
}
convenience init(point: (Double, Double)) {
self.init(x: point.0, y: point.1)
}
// 指派初始化方法 / 指派构造器
// 被其他初始化方法调用的初始化方法
init(x: Double, y: Double) {
self.x = x
self.y = y
}
func distanceTo(other: Point) -> Double {
let dx = x - other.x
let dy = y - other.y
return sqrt(dx * dx + dy * dy)
}
func moveTo(x: Double, _ y: Double) {
self.x = x
self.y = y
}
func moveBy(dx: Double, _ dy: Double) {
x += dx
y += dy
}
}
调用
//三种初始化方法,都可以使用
let p1 = Point()
let p2 = Point(x: 3, y: 4)
let p3 = Point(point: (-3.5, 6.7))
// 0. 发现类
// - 在对问题的描述中找名词和动词
// - 名词会成为类或者类中的属性 动词会成为类中的方法
// 1. 定义类
// - 数据抽象(属性)
// - 行为抽象(方法)
// - 初始化方法
// 访问修饰符
// - public (公开)
// - internal (内部的) - 默认
// - private (私有)
class Circle {
// stored property
// 存储属性(保存和圆相关的数据的属性)
var center: Point
var radius: Double
init(center: Point, radius: Double) {
self.center = center
self.radius = radius
}
// 通常获得某个计算出的值的方法都可以设计成计算属性
// computational property
// 计算属性(通过对存储属性做运算得到的属性)
var perimeter: Double {
// 圆的周长是一个只读属性
// 所以此处只有get{}没有set{}
get { return 2 * M_PI * radius }
}
var area: Double {
get { return M_PI * radius * radius }
}
}
奥特曼的类里面有属性的保护和调用
func randomInt(min: UInt32, _ max: UInt32) -> Int {
return Int(arc4random_uniform(max - min + 1) + min)
}
class Ultraman {
private var _name: String
private var _hp: Int
private var _mp: Int
var isAlive: Bool {
get { return _hp > 0 }
}
var name: String {
get { return _name }
}
var hp: Int {
get { return _hp }
set { _hp = newValue > 0 ? newValue : 0 }
}
var mp: Int {
get { return _mp }
}
init(name: String, hp: Int, mp: Int) {
_name = name
_hp = hp
_mp = mp
}
func attack(monster: Monster) {
let injury = randomInt(15, 20)
monster.hp -= injury
}
func hugeAttack(monster: Monster) {
}
func magicalAttack(monsters: [Monster]) {
}
}
小怪兽的类
class Monster {
private var _name: String
private var _hp: Int
var isAlive: Bool {
get { return _hp > 0 }
}
var name: String {
get { return _name }
}
var hp: Int {
get { return _hp }
set { _hp = newValue > 0 ? newValue : 0 }
}
init(name: String, hp: Int) {
_name = name
_hp = hp
}
func attack(ultraman: Ultraman) {
let injury = randomInt(5, 10)
ultraman.hp -= injury
}
}
类的拓展
// 如果在某个特定的应用场景中你发现现有的类缺少了某项功能
// 那么可以通过类扩展(extension)的方式现场添加这项功能
extension Point {
var cgPoint: CGPoint {
get { return CGPointMake(CGFloat(x), CGFloat(y)) }
}
}
extension UIColor {
static func randomColor() -> UIColor {
let r = CGFloat(randomInt(0, 255)) / 255.0
let g = CGFloat(randomInt(0, 255)) / 255.0
let b = CGFloat(randomInt(0, 255)) / 255.0
return UIColor(red: r, green: g, blue: b, alpha: 1)
}
}
extension CGPoint {
var myPoint: Point {
get {
return Point(x: Double(self.x), y: Double(self.y))
}
}
}
普遍随机函数
func randomInt(min: UInt32, _ max: UInt32) -> Int {
return Int(arc4random_uniform(max - min + 1) + min)
}
画布里面的东西
var pointsArray: [Point] = []
var trisArray: [Triangle] = []
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
if let touch = touches.first {
let touchPoint = touch.locationInView(self)
pointsArray.append(touchPoint.myPoint)
if pointsArray.count == 3 {
let t = Triangle(va: pointsArray[0], vb: pointsArray[1], vc: pointsArray[2])
t.color = UIColor.randomColor()
trisArray.append(t)
setNeedsDisplay()
pointsArray.removeAll()
}
}
}
override func drawRect(rect: CGRect) {
for t in trisArray {
t.draw()
}
}
}