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()
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,794评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,050评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,587评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,861评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,901评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,898评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,832评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,617评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,077评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,349评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,483评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,199评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,824评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,442评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,632评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,474评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,393评论 2 352

推荐阅读更多精彩内容