• iOS-Senior14-Swift2


    1.?和!的区别

    在swift中,可选类型(?)其实质是一个枚举类型,里面有None和Some两种类型,其实nil的值相当于optional.None,没有值就相当于optional.None,如果有值就相当于optional.Some

    //MARK: - !和?区别

    1.解包

    ?:有值,没值(nil)

    !:强制解包

    eg: var number : Int? = 8

          var number1 = number

          print(number1)

    注意:如果对没有值的变量进行强制解包的情况下回造成崩溃

    2.可选绑定,不用强制解包

    if var number2 = number {

           print(number2)

    }

    //隐式解析可选类型:有值,没值

    var intNumber :Int != 10

    var intNumber1 = intNumber

    print(intNumber1)

    注意:如果!强制解析没值的变量,也会造成崩溃

    可选绑定:

    if var intNumber2 = number {

             print(intNumber2)

    }

    //MARK: - 结构体

    1.声明一个结构体

    struct Rect {

    //声明结构体变量的属性 (存储属性)

    var x : Float

    var y : Float

    var width : Float 

    var height : Float

    //声明结构体属性,要使用static

    static var description : String ?

    //声明一个计算属性(是用来专门计算结构体变量属性的setter的方法,和getter方法,其本身并没有存储功能)

    var centerX : Float {

    //set方法

    set {

    x = newValue

    }

    //get方法(必须的有)

    get {

    return x / 2

    }

    }

    //声明方法

    //声明一个结构体变量的方法(相当于oc中的实例方法)

    func frameInfor () {

    print ("x:(x),y:(y),(width),height:(height)")

    }

    //声明一个结构体方法(相当于oc中的类方法,使用static方法修饰)

    static func infor() {

    print("这是结构体方法")

    }

    }

    //1.根据结构体去定义一个结构体变量

    var frame = Rect (x:10,y:10,100,height:100)

    //2.访问结构体变量中的属性

    //注意:结构体变量的属性类型可以使用let去修饰,只不过访问的时候不能对其进行修改

    print(frame.x)

    frame.x = 20

    print(frame.x)

    //3.访问结构体属性

    Rect.description = "我是结构体属性"

    print(Rect.description)

    //4.访问计算属性

    frame.centerX = 200

    //这句话就相当于在调用centerX的setter方法

    let value = frame.centerX  //这句话相当于在调用center中的set方法

    print(value) //这句话就相当于调用center中的get方法

    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

    self.age = age

    }

    //自定义初始化方法

    init(name : String) {

    self.name = name

    }

    //声明类属性

    static var introduce : String?

    //计算属性

    var lalue : 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,我是实例方法")

    }

    }

    //创建对象[此时应该注意和oc区别开,实例对象,:后边跟的是类(注意:要初始化对象一定要写初始化构造的方法)]

    var person1 : Person = Person(name : "MBBoy",age : 69)

    //访问类中的属性

    print(person.name!)

    //属性后+?和不加+的区别就是输出的时候,是否用解包,带?的不用optional里的东西,就要用!解包,而不加问号的直接输出就可以

    //3.访问类属性

    Person.introduce = "我是xxxx"

    //4.访问计算属性

    person1.value = 28

    print(person1.value)

    //5.访问类方法

    Person.sayHi()

    Person.sayHi1()

    //6.访问实例方法

    person1.sayHi2()

     

    //声明一个子类方法

    class Student : Person {

    //重写父类的方法

    //重写类方法

    override class func sayHi() {

    print("我同桌是肉丝")

    }

    //重写父类中的实例方法

    override func sayHi2() {

    print("我同桌是肉丝的子类,重写了父类中的对象方法")

    }

    }

    var student = Student (name : "rose",age : 38)

    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)")

    //结果:dog.name = "欢欢",dog1.name = "贝贝"

    //引用值类型(可以用dog改变dog1)

    class animal {

    var name : String?

    var age : Int?

    init (name : String,age : Int) {

    self.name = name

    self.age = age

    }

    }

    var dog = animal (name : "flower",age : 0)

    var dog1 = dog

    print ("dog.name :(dog.name) , dog1.name : (dog1.name)")

    //MARK: - 协议

    //当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 :"fu",age :10)

    man.cook()

    man.wash()

    man.divideMoney()

    //MARK: - 扩展(extension)

    //扩展协议中的相关方法(打豆豆)

    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: - 闭包

    //求两个数的最大值

    //使用闭包

    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 : 88,num2 : 66)

  • 相关阅读:
    System.Reflection.ParameterModifier.cs
    System.Reflection.CallingConvention.cs
    System.Reflection.ParameterAttributes.cs
    System.Reflection.ParameterInfo.cs
    System.Reflection.MethodImplAttributes.cs
    System.Reflection.ExceptionHandlingClause.cs
    System.Reflection.LocalVariableInfo.cs
    交换分区设置
    PYCURL ERROR 22
    Could not reliably determine the server's fully qualified domain name
  • 原文地址:https://www.cnblogs.com/zhoulina/p/5521054.html
Copyright © 2020-2023  润新知