zoukankan      html  css  js  c++  java
  • Swift语言(二)

    ?和!的区别

    ?是可选类型.其实是枚举类型,里边有None和Some两种类型,其实nil值相当于OPtional.None,如果有值相当于OPtional.Some

    !强制解包

    //如果对没有值得变量进行强制解包的情况下会造成崩溃

    Var number : Int? = 6

    var number = number!

    print(number1)

    //可选绑定.不用强制解包

    if var number2 = number{
        print(number2)   

    }

    //! 隐士解析可选类型,有值,没值(nil)

    //如果!强制解析没值的变量也会造成崩溃

    var intNumber : Int! = 10

    var intNumber1 = intNumber

         print|(intNumber1)

    //可选绑定

    if var intNumber2 - intNumber{

           print(intNumber2)

    }

    //MARK - 结构体
    //声明结构体
    struct Rect{
        //生名结构体变量的属性(存储属性)
        var x:Float
        var y:Float
        var Float
        var height:Float
        //声明结构体属性 : static
        static var description : String?
        //声明一个计算属性.是用来专门计算结果体变量的属性的setter的方法和getter方法,本身没有存储功能
        var centerX:Float{
            //set方法
            set{
                x = newValue
            }
            //get方法必须要有
            get{
                return x/2
            }
        }
        var centerY:Float{
            get{
                return y/2
            }
        }
        //声明方法:结构体变量方法(相当于oc里的实例方法)
        func frameInfor(){
            print("x:(x),y:(y),(width),height:(height)")
        }
        //声明一个结构体方法(相当于OC中的类方法)使用stati修饰
        static func infor(){
            print("结构体方法")
        }
        
    }

    //1.根据结构体去定义一个结构体变量
    var frame = Rect(x: 11.1, y: 12.1, 100, height: 100)
    //2.访问结构体变量中的属性
    //注意在;结构体变量的属性可以使用let去修饰,只不过访问的时候不能frame.x = 20
    print(frame.x)

    //3.访问结构体属性
    Rect.description = "哈哈哈哈"
    print(Rect.description)

    //4.访问计算属性
    frame.centerX = 200 //这句话就相当于在调用centerx的setter方法
    let value = frame.centerX //这句话相当于调用centerX的getter方法
    print(value)

    //5,调用结构体变量方法
    frame.frameInfor()
    //调用结构体方法
    Rect.infor()

    //MARK - 类(class)
    class Person{
        var name:String?
        var age:Int?
        
        //构造初始化方法
        init(name:String,age:Int){
            self.name = name
            self.age = age
        }
        //自定义初始化方式
        init(name:String){
            self.name = name
        }
        //声明类属性
        static var introduce:String?
        
        //声明计算属性
        var value:Int{
            set(a){
                age = a//在写计算属性的时候一定不能出现self.  否则会造成死循环
          }
            get{
               return age!
            }
        }
        //声明一个类方法
        //1.在类方法中前边加上static修饰.[虽然是一个类方法,但是在子类中进行重写]
        static func sayHi(){
            print(introduce)//注意:在类方法中只能使用类属性,不能使用对象属性
        }
        //2.在类方法前面加上class修饰[他是一个类方法,可以被子类重写]
        class func sayHi1() {
            print(introduce)
        }
        //声明对象(实例)放法
        func sayHi2(){
            print("hello,酒大黄")
        }
        
        
    }
    //1.创建对象[注意和oc区分开,示例对像:后边跟的是类]
    var person1:Person = Person(name: "MBBboy", age: 20)

    //访问类中的属性(对象属性)
    print(person1.name!)

    //3.访问类属性
    Person.introduce = "啊啊啊啊"

    //4.访问计算属性
    person1.value = 23
    print(person1.value)

    //5.访问类方法
    Person.sayHi()
    Person.sayHi1()

    //6.访问实例方法
    person1.sayHi2()

    //定义一个子类,继承Person
    //在swift中不支持多继承
    class Student:Person{
        //重写父类的方法
        //重写父类中的类方法
        override class func sayHi1(){
            print("子类,重写了父类的类方法")
        }
        //重写父类中的实例方法
        override func sayHi2() {
            print("我是子类,重写了父类中的对象放法")
        }
    }

    //初始化Student对象
    var student = Student(name: "噶的我", age: 31)
    Student.sayHi1()
    student.sayHi2()

    //MARK - 值类型和引用值类型的区别
    /*
    //值类型
    struct animal{
        var name:String?
        var age:Int?
        init (name:String,age:Int){
            self.name = name
            self.age = age
        }
    }
    var dog = animal(name: "贝贝", age: 3)
    var dog1 = dog //此时 将dog的数据拷贝给dog1
    dog.name = "换换"
    print("dog.name:(dog.name!),dog1.name:(dog1.name!)")
    */

    //引用值类型
    class animal{
        var name:String?
        var age:Int?
        init (name:String,age:Int){
            self.name = name
            self.age = age
        }
    }
    var dog = animal(name: "花花", age: 23)
    var dog1 = dog
    print("dog1.name:(dog1.name!)")
    dog.name = "欢欢"
    print("dog.name:(dog.name!),dog1.name:(dog1.name!)")




    //MARK - 协议(protocol)

    //当swift中声明协议的时候.协议里有可选方法需要使用@objc关键字修饰

    @objc protocol MarryDelegate{
        func cook() //做饭
        func wash() //洗衣服
        optional func hitDouDou()//打豆豆
    }

    protocol DivorceDelegate{
        func divideMoney() //分割财产
    }
    //如果一个类要遵循协议的时候 如果这个类有父类,要在:后先写父类,在遵守协议
    class Man: Person,MarryDelegate,DivorceDelegate {
        @objc func cook() {
            print("学厨师,新东方")
        }
        @objc func wash() {
            print("洗衣机")
        }
        func divideMoney() {
            print("分财产")
        }
    }

    //创建一个男人对象
    let man = Man(name: "韦小宝", age: 22)
    man.cook()
    man.wash()
    man.divideMoney()


    //MARK: - 扩展 (Extension延展)
    //1,扩展协议中的相关方法
    extension Man{
        @objc func hitDouDou() {
            print("哈哈哈")
        }
    }

    man.hitDouDou()

    //2,扩展类方法以及对象方法(给某一个类添加方法,类似于OC中的category类目)

    extension Man{
        //扩展一个对象
        func sing(){
            print("老婆")
        }
        //扩展一个类方法
        class func sleep() {
            print("多喝水,早点睡")
        }
    }

    man.sing()
    Man.sleep()

    //MARK:- 闭包

    //求两个数的最大值
    /*
    在oc中使用block实现
    int (^myBlock)(int num1,int num2) = ^int (int num1,int num2){
              return num1 > num2 ? num1 : num2;
    }
    */

    //使用闭包
    var myBlock : ((num1:Int,num2:Int)->Int)
    //第一种使用方式
    myBlock = {
        (num1:Int,num2:Int)->Int in //切记不能忘记in
        return num1 > num2 ? num1 : num2
    }

    //第二种 方式
    myBlock = {
        num1,num2 in
        return num1 > num2 ? num1 : num2
    }

    //第三种方式
    myBlock = {
        num1,num2 in
        num1 > num2 ? num1 : num2
    }
    //第四种方式
    myBlock = {
        $0 > $1 ? $0 : $1
    }

    //第五种方式
    myBlock = {
        (num1,num2)->Int in
        return num1 > num2 ? num1 : num2
    }

    let max = myBlock(num1: 23, num2: 45)
    print(max)

  • 相关阅读:
    1020. Tree Traversals
    1001. A+B Format
    centos 各类无线网卡编译
    vim 详细配置 超全
    深夜复习strcpy函数原型竟然暗藏着这么多玄机
    第一篇博客
    strcat函数使用中出现的问题
    strcpy与strncpy工作方式及其区别
    strcpy与面试官
    linux下多线程编程
  • 原文地址:https://www.cnblogs.com/zhanglida/p/5520772.html
Copyright © 2011-2022 走看看