美文网首页
Swift--面向对象以及实例属性--07

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

作者: XieHenry | 来源:发表于2017-07-28 18:46 被阅读40次

    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

          本文链接:https://www.haomeiwen.com/subject/ftoxlxtx.html