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()
网友评论