Swift--面向对象以及实例属性--07

Swift 3 推荐你自己定义的对象使用结构体。
属性是一个类(class)/结构体(struct)/枚举关联的变量

----结构体基础----

结构体内的常量,和平时的常量类型一样。
结构体实例设置为Var,可以整个实例改变,但是实例内的属性 仍然不能改变。

//声明一个结构体(struct)
struct Location {
    let x : Double
    let y : Double
}

//初始化一个结构体
let bj = Location(x: 100, y: 100)
let sh : Location = Location(x: 200, y: 200)
//获得属性值
bj.x


//属性含有变量var的结构体
struct Place {
    let location : Location
    var name : String
}

//要想修改属性,结构体变量也必须是var
var place = Place(location: bj, name: "北京地址")
place.name = "北京坐标"

----构造函数----

属性有2中:

  • 实例属性:实例化后才能使用
  • 类型属性:属于类型固有的,实例不能调用

1.实例属性

class 角色 {
    var id = " "
    var money = 0
}

//实例化角色
let xiaobo = 角色()
xiaobo.id = "小波"
xiaobo.money = 900000

计算属性:由其他属性计算得出的,由getter和setter组成
getter获取器(必须):描述属性如何计算及返回语句,形式:get {语句和返回}
setter设置器(可选):有薪值(newValue)后如何影响其他属性,形式:set {语句}
游戏角色的当前坐标,通常是移动方式代表的位移量相关。

struct 坐标 {
   var x = 0
   var y = 0
}

enum 移动方式 {
   case 走
   case 跑
   case 骑马
   case 传送
}

class 法师:角色 {
   var 人物坐标 = 坐标()
   var 人物移动的方式 = 移动方式.走
   
   var 当前坐标:坐标 {
       
       get {
           switch 人物移动的方式 {
           case .走:
               人物坐标.x += 1
               人物坐标.y += 1
               
           case .跑:
               人物坐标.x += 3
               人物坐标.y += 3
               
           case .骑马:
               人物坐标.x += 10
               人物坐标.y += 10
               
           case .传送:
               人物坐标.x += 1000
               人物坐标.y += 1000
           }
           return 人物坐标
       }
       
       
       set {
           人物坐标 = newValue
       }
   }

}


let 法师1 = 法师()
法师1.当前坐标
法师1.人物移动的方式 = .跑
法师1.当前坐标
法师1.人物移动的方式 = .传送
法师1.当前坐标


//计算属性的setter方法,影响其他属性
法师1.当前坐标 = 坐标(x:2000,y:900)
法师1.人物坐标

属性监视器:对属性值的变化进行响应
willSet:事前响应,薪值 newValue
didSet:事后响应,旧值oldValue

class 经验 {
    var 总经验 : Int = 0 {
        willSet {
            print("当前总经验值是:\(newValue)!")
        }
        didSet {
            print("增加了\(总经验 - oldValue)点经验值!")
        }
    }
}

var 经验1 = 经验()
经验1.总经验 = 100
经验1.总经验 = 300

2.实例属性

  • 对于类,计算型的类型属性,前面加关键字class可被子类重写(override)
class 生命体 {
   class var 遗传方式 : String {
        return "RNA"
    }
}

class Human : 生命体 {
    override class var 遗传方式 : String {
        return "DNA"
    }
}

Human.遗传方式
struct 逛街 {
   static let 试衣间 = "优衣库"
   static let 网站 = "www.taobao.com?cate="
    var cate = ""

    
    var shareUrl : String {
        return 逛街.网站 + cate
    }
}

逛街.试衣间
let 逛淘宝 = 逛街.init(cate: "seafood")
逛淘宝.shareUrl

方法是一个类/结构体/枚举关联的函数,分为实例方法和类型方法。

  • 实例方法
    定义和使用:与函数相似,self属性:引用示例自身,通常可以不写。
struct EXPTimes {
    var open = false
    var times = 1
}

enum Monster : Int {
    case sheep = 10
    case cat = 50
    case snake = 100
}



class RmbPlayer {
    var exp = 0
    var expTimes = EXPTimes()
    
    func idle() {
        exp += 500
        print("挂机成功一次,总经验为\(exp)")
    }
    
    
    func kill (monster : Monster, expTimes : Int)   {
        exp += (monster.rawValue * expTimes)
        print("当前总经验为\(exp)")
    }
    
}

var xiaobo1 = RmbPlayer()
xiaobo1.idle()
xiaobo1.kill(monster: Monster.cat, expTimes: 2)
xiaobo1.expTimes.open = true
xiaobo1.expTimes.times = 2
xiaobo1.kill(monster: Monster.snake, expTimes: 2)


var xiaobo2 = RmbPlayer()
xiaobo2.idle()
xiaobo2.kill(monster: Monster.cat, expTimes: 5)
xiaobo2.expTimes.open = true
xiaobo2.expTimes.times = 5
xiaobo2.kill(monster: Monster.snake, expTimes: 5)

类型方法:属于类型本身,无需实例化就可以使用,方法前加关键字 static

class Player {
   static var nick = "小波"
    
   static func server()  {
        print("\(nick),你在北京联通一区")
    }
    
}
class Player {
   static var nick = "小波"
    
   class func server()  {
        print("\(nick),你在北京联通一区")
    }
    
}

Player.server()


class ShanghaiPlayer : Player {
   override static func server()  {
        print("\(nick),你在上海电信2区")
    }
}

ShanghaiPlayer.server()

你可能感兴趣的:(Swift--面向对象以及实例属性--07)