第三周第三天
類
class Point {
var x: Double
var y: Double
// 我們可以在一個類中定義多個初始化方法
// 便利初始化方法 / 便利構(gòu)造器
// 調(diào)用了其他的初始化方法的初始化方法
convenience init() {
self.init(x: 0, y: 0)
}
convenience init(point: (Double, Double)) {
self.init(x: point.0, y: point.1)
}
// 指派初始化方法 / 指派構(gòu)造器
// 被其他初始化方法調(diào)用的初始化方法
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
}
}
調(diào)用
//三種初始化方法奠旺,都可以使用
let p1 = Point()
let p2 = Point(x: 3, y: 4)
let p3 = Point(point: (-3.5, 6.7))
// 0. 發(fā)現(xiàn)類
// - 在對問題的描述中找名詞和動詞
// - 名詞會成為類或者類中的屬性 動詞會成為類中的方法
// 1. 定義類
// - 數(shù)據(jù)抽象(屬性)
// - 行為抽象(方法)
// - 初始化方法
// 訪問修飾符
// - public (公開)
// - internal (內(nèi)部的) - 默認
// - private (私有)
class Circle {
// stored property
// 存儲屬性(保存和圓相關(guān)的數(shù)據(jù)的屬性)
var center: Point
var radius: Double
init(center: Point, radius: Double) {
self.center = center
self.radius = radius
}
// 通常獲得某個計算出的值的方法都可以設(shè)計成計算屬性
// computational property
// 計算屬性(通過對存儲屬性做運算得到的屬性)
var perimeter: Double {
// 圓的周長是一個只讀屬性
// 所以此處只有g(shù)et{}沒有set{}
get { return 2 * M_PI * radius }
}
var area: Double {
get { return M_PI * radius * radius }
}
}
奧特曼的類里面有屬性的保護和調(diào)用
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
}
}
類的拓展
// 如果在某個特定的應用場景中你發(fā)現(xiàn)現(xiàn)有的類缺少了某項功能
// 那么可以通過類擴展(extension)的方式現(xiàn)場添加這項功能
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))
}
}
}
普遍隨機函數(shù)
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()
}
}
}