swift2.0 学习笔记seven

//类和结构体

//共同点:1.定义属性用于存储值 2.定义方法用于提供功能

//3.定义构造器用于生成初始化值 4.通过扩展以增加默认实现的功能

//5.实现协议以提供某种标准功能


//类的附加功能有:1.继承允许一个类继承另一个类的特征

//2.类型转换允许在运行时检查和解释一个类实例的类型

//3.允许一个类实例释放任何其所被分配的资源

//4.引用计数允许对一个类的多次引用

struct Dlg{

    var width = 0

    var height = 0

    //var ddd = MyMode()

}

class Mode {

    var dlg = Dlg() //结构体Dlg的实例,

    var interlaced = false

    var frameRate = 0.0

    var name : String?

}

class DataLoading{

    var fileName = "data.txt"//假设这个类的初始化会消耗不少时间

}

class DataManager {

    lazy var importer =  DataLoading()

    var data = [String]()

}

class ViewController: UIViewController {

    

    override func viewDidLoad() {

        super.viewDidLoad()

        //存储属性

        //简单来说,一个存储属性就是存储在特定类或结构体的实例里的一个常量或变量

        //存储属性可以是变量存储属性(var),也可以常量存储属性(let

        struct FixedLengthRange {

            var firstValue: Int

            let length: Int

        }

        var rangeOfThreeItems = FixedLengthRange(firstValue: 0, length: 3) // 该区间表示整数0,1,2

        rangeOfThreeItems.firstValue = 6

        // 该区间现在表示整数6,7,8

        

        let rangeOfThreeItems2=FixedLengthRange(firstValue: 0, length: 3)

        //rangeOfThreeItems2.firstValue=10//会报错的(因为 rangeOfThreeItems2 被声明成了常量

        //当值类型的实例被声明为常量的时候,它的所有属性也就成了常量。

        //引用类型的类(class)则不一样。把一个引用类型的实例赋给一个常量后,仍然可以修改该实例的变量属 性。

        

        //延迟存储属性

        //延迟存储属性是指当第一次被调用的时候才会计算其初始值的属性。在属性声明前使用 lazy 来标示一个延迟存储 属性。

        //必须将延迟存储属性声明成变量(使用 var 关键字) 因为常量属性在构造过程完成之前必须要有初始值

       let manager = DataManager()

        manager.data.append("one")

        manager.data.append("two")

       //此时manager实例的 importer 属性还没有被创建

       print(manager.importer.fileName) //data.txt

       //manager实例的 importer 属性现在被创建了

        

       //计算属性

       //类、结构体和枚举可以定义计算属性。计算属性不直接存储值,而是提供一个 getter 和一个可选的 setter,来间接获取和设置其他属性或变量的值。

        struct Point {

        var x = 0.0

        var y = 0.0

        }

        struct Size{

        var width = 0.0 ,height=0.0

        }

        struct Rect{

            var origin :Point

            var size : Size

            var center : Point{

                get {

                    let centerX = origin.x + (size.width)/2

                    let centerY = origin.y + (size.height)/2

                    return Point(x: centerX, y: centerY)

                }

                set(newCenter) {

                    origin.x = newCenter.x - (size.width)/2

                    origin.y = newCenter.y - (size.height)/2

                }

            }

        }

        var square = Rect(origin: Point(x: 0.0, y: 0.0), size:Size(width: 10.0, height: 10.0))

        let initSquareCenter = square.center

        print("\(initSquareCenter.x),\(initSquareCenter.y)")//5.0,5.0

        square.center = Point(x: 15.0, y: 15.0)

        print("square.origin is now at \(square.origin.x),\(square.origin.y)")//square.origin is now at 10.0,10.0

        //如果计算属性的 setter 没有定义表示新值的参数名,则可以使用默认名称 newValue 

        struct Rect2{

            var origin :Point

            var size : Size

            var center : Point{

                get {

                    let centerX = origin.x + (size.width)/2

                    let centerY = origin.y + (size.height)/2

                    return Point(x: centerX, y: centerY)

                }

                set {

                    origin.x = newValue.x - (size.width)/2

                    origin.y = newValue.y - (size.height)/2

                }

            }

        }

        

        

        //只读计算属性

        //只有 getter 没有 setter 的计算属性就是只读计算属性。只读计算属性总是返回一个值,可以通过点运算符访问,但不能设置新的值

        struct ttt{

            var x = 0.0 , y = 0.0, z = 0.0

            var xyz:Double{

                return x*y*z

            }

        }

        let mytest = ttt(x: 10, y: 20, z: 5)

        print(mytest.xyz) //1000.0

        

        

        //属性观察器

        //属性观察器监控和响应属性值的变化,每次属性被设置值的时候都会调用属性观察器,甚至新的值和现在的值相同的时候也不例外。

        // willSet 在新的值被设置之前调用 willSet 观察器会将新的属性值作为常量参数传入  默认名称newValue

        // didSet 在新的值被设置之后立即调用 ,将旧的属性值作为参数传入,可以为该参数命名或者使用默认参数名 oldValue 

        let mystepCounter = stepCounter()

        mystepCounter.totalSteps = 150

        //willSet stepto  newValue=150

        //DidSet step oldValue= 0

        //前进了150

        mystepCounter.totalSteps = 100

        //willSet stepto  newValue=100

        //DidSet step oldValue= 150

        //后腿了50

        

        

        //全局变量和局部变量

        //计算属性和属性观察器所描述的模式也可以用于全局变量和局部变量。全局变量是在函数、方法、闭包或任何类型之外定义的变量。局部变量是在函数、方法或闭包内部定义的变量。

        

        //类型属性

        //实例的属性属于一个特定类型实例, 每次类型实例化后都拥有自己的一套属性值,实例之间的属性相互独立。

        //也可以为类型本身定义属性,不管类型有多少个实例,这些属性都只有唯一一份。这种属性就是类型属性。

        //类型属性是作为类型定义的一部分写在类型最外层的花括号内,因此它的作用范围也就在类型支持的范围内

        //使用关键字static来定义值类型的类型属性,关键字class来为类定义类型属性。

        struct SomeStructure {

            static var storedTypeProperty = "Some value."

            static var computedTypeProperty: Int { //只读计算属性

            return 1 }

        }

        enum SomeEnumeration {

            static var storedTypeProperty = "Some value."

            static var computedTypeProperty: Int { //只读计算属性

            return 6 }

        }

      

        print(SomeStructure.storedTypeProperty)//Some value.

        SomeStructure.storedTypeProperty = "other Value"

        print(SomeStructure.storedTypeProperty)//other Value

        print(SomeEnumeration.computedTypeProperty)//6

        print(SomeClass.computedTypeProperty)//27

  

        

        //声道模型使用 AudioChannel 结构体的实例来表示:

        struct AudioChannel{

            static let thresholdLevel=10

            static var maxInputLevelForAllChannels=0

            var currentLevel : Int = 0 {

            didSet{

            if currentLevel > AudioChannel.thresholdLevel{

            currentLevel = AudioChannel.thresholdLevel

           

            }

            if currentLevel > AudioChannel.maxInputLevelForAllChannels{

            AudioChannel.maxInputLevelForAllChannels = currentLevel

            

            }

             print("thresholdLevel=\(AudioChannel.thresholdLevel)")

             print("currentLevel=\(currentLevel)")

             print("maxInputLevelForAllChannels=\(AudioChannel.maxInputLevelForAllChannels)")

            }

            }

        }

        var leftChannel = AudioChannel()

        var rightChannel = AudioChannel()

        leftChannel.currentLevel = 7

        //thresholdLevel=10 currentLevel=7 maxInputLevelForAllChannels=7

        

        rightChannel.currentLevel=15

        //thresholdLevel=10 currentLevel=10 maxInputLevelForAllChannels=10

        

       

    }

}

class SomeClass {

            static var storedTypeProperty = "Some value."

            static var computedTypeProperty: Int { //只读计算属性

            return 27 }

            class var overrideableComputedTypeProperty: Int { //只读计算属性

            return 107

            } }

class stepCounter {

    var totalSteps : Int = 0 {

        willSet{

            print("willSet stepto  newValue=\(newValue)")

        }

        didSet{

            

            print("DidSet step oldValue= \(oldValue)")

            if totalSteps >= oldValue{

                print("前进了\(totalSteps - oldValue) ")

            }else{

                print("后腿了\(oldValue - totalSteps) ")

            }


        }

    }

}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值