[绍棠_swift] Swift中的结构体

来源:互联网 发布:c语言二级证书有用吗 编辑:程序博客网 时间:2024/06/16 15:04

//

//  ViewController.swift

//  Learn_Swift_3

//

//  Created by Coco on 2017/7/21.

//  Copyright © 2017 Coco. All rights reserved.

//


import UIKit


class ViewController: UIViewController {

    class person1 {

        var name ="Tom"

//        class var height: Int = 10    // 错误!类中不能有全局存储属性的,只能是计算属性

    }

    

    staticvar height0:Int = 10//可以设定全局属性,需要初始化

    struct Person2 {

        var age:Int

    }

        

    overridefunc viewDidLoad() {

        super.viewDidLoad()

        // Do any additional setup after loading the view, typically from a nib.

        

        var a:Int = 4

        var b:Int?

        a = 1

        b = 1

        print("a的值\(a) b得值\(String(describing: b))");

        

        let p1 =person1()

        var p_Name = p1.name;

        

        ViewController.height0 = 20

        var height1 =ViewController.height0

        print("height1的值 \(height1)")

        

        let p2 =Person2(age: 10)  //当使用默认构造器时,必须初始化里面所有的属性

        

        class Person3 {

            var name:String ="Coco"  //需手动初始化

            var age:Int = 10

            let  height = 170

            lazyvar p1:person1 =person1()     //延迟,必须是var

        }

        var p3 =Person3()

        var p3_Name = p3.name

        p3.age = 18    //设置

        // 懒加载lazy存储属性:当使用该属性时才进行初始化,好处是避免空间浪费,

        print("p3p1的值 \(p3.p1.name)")

        

/*

         get:用来封装取值的过程

         set:用来封装设置的过程

  */

        class Person4 {

            var name:String ="Json"

            var height:Int = 167

            var age:Int{      //只能是var

                get {

                    returnheight * 2

                }

                set(newAge) {

                    height = newAge / 2

                }

            }

            var weight1:CGFloat {  //只读(get可省略)

                get {

                    returnCGFloat(height * 2)

                }

            }

            

        }

        var p4 =Person4()

        p4.age = 10    //当设age10时, height变为5,当不设置age的值时, age值为height*2 334

        print("person4对应的值\(p4.name, p4.age, p4.height, p4.weight1)")

//        p4.weight1 = 130        // 只读,没有set方法,不能赋值

        

        /// 死循环

        class Person5 {

            var weight:Int = 10

            var age:Int {

                get {

                   returnage  //死循环, age会调用get方法

                }

                set {

                    age = newValue //死循环

                }

            }

        }

//        var p5 = Person5()

//        p5.age = 10       // 造成死循环, crash

        

        // 类属性(或者叫做类型属性)class关键字修饰.类属性只能是计算属性.属性就是类似javastatic修饰的属性.一个类只有一份,且多个实例对象共享.可直接用类名调用

        class Person6 {

            classvar name:String {

                return"Coco"

            }

        }

        var p6 =Person6()

//        p6.name = "TOM"       // 会报错

        print("person6的值为\(Person6.name)")

        

        // 监视属性变化的两个方法willSet didSet   (willSet, didSetset, get不能共存)

        class Person7 {

            var name:String ="Coco" {

                willSet {

                    print("Person7新值为:\(newValue)")

                }

                didSet {

                    print("Person7旧值为:\(oldValue)")

                }

            }

        }

        var p7 =Person7()

        p7.name ="TOM"

        

        // 函数与方法

        class Person8 {

            func sum(num1:Int, num2:Int) {

                print("person8的值:\(num1 + num2)")

            }

        }

        var p8 =Person8()

        p8.sum(num1: 10, num2: 10)

        

        // class修饰

        class Person9 {

            classfunc sum(num1:Int, num2:Int) {

                print("person9的值:\(num1 + num2)")

            }

        }

        Person9.sum(num1: 10, num2: 10)

                

        // selfsuperOC相同

        class Person10 {

            func sum(num1:Int, num2:Int) {

                self.fun()     //对象方法调用对象方法,类方法调用类方法

            }

            func fun() {

                print("person10")

            }

        }

        

        // 下标

        struct Person11 {

            let height:Int    //结构体在这里可以不初始化

            

            subscript(index:Int)->Int {

                returnheight * index

            }

        }

        

        var p11 =Person11(height:170)

        p11[3]     //直接像访问数组一样访问, 

        print("person11\(p11[3])")

        

    }


    overridefunc didReceiveMemoryWarning() {

        super.didReceiveMemoryWarning()

        // Dispose of any resources that can be recreated.

    }


}


原创粉丝点击