zoukankan      html  css  js  c++  java
  • Swift -- Swfit 笔记

    *:结构体是传值,类是传引用

    构造方法分为指定构造方法和便利构造方法
    便利构造方法以 convenience 开头:例:convenience init(){ ... }
    指定构造方法必须调用其父类的指定构造方法
    便利构造方法必须调用同一类中定义的其他构造方法
    便利构造方法必须最终以调用一个指定构造方法结束

    只有指定构造方法才能调用父类的其他构造方法

    只有便利构造方法才能调用当前类的其他构造方法

    class Dog{
        var name:String
        var age:Int
        init(name:String, age:Int){
            self.name = name
            self.age = age
        }
        convenience init(name:String){
            self.init(name:name, age:1)
        }
        convenience init(age:Int){
            self.init(name:"no name", age:age)
        }
    }
    ***********************************

    class Animal{
        init(){
            println("Animal-init")
        }
    }
    class Dog:Animal{
        init(){
            println("Dog-init")
        }
    }
    var d = Dog()

     ***************************************

    在实例方法中修改值类型

    Swift 语言中结构体和枚举是值类型。一般情况下,值类型的属性不能在它的实例方法中被修改。

    但是,如果你确实需要在某个具体的方法中修改结构体或者枚举的属性,你可以选择变异(mutating)这个方法,然后方法就可以从方法内部改变它的属性;并且它做的任何改变在方法结束时还会保留在原始结构中。

    方法还可以给它隐含的self属性赋值一个全新的实例,这个新实例在方法结束后将替换原来的实例。

    
    struct area {
        var length = 1
        var breadth = 1
        func area() -> Int {
            return length * breadth
        }
        mutating func scaleBy(res: Int) {
            length *= res
            breadth *= res
            print(length)
            print(breadth)
        }
    }
    var val = area(length: 3, breadth: 5)  // ?? (self)
    val.scaleBy(3)
    val.scaleBy(30)
    val.scaleBy(300)

    以上程序执行输出结果为:

    9
    15
    270
    450
    81000
    135000

    *******************************************************
    类型方法
    实例方法是被类型的某个实例调用的方法,你也可以定义类型本身调用的方法,这种方法就叫做类型方法。
    声明结构体和枚举的类型方法,在方法的func关键字之前加上关键字static。类可能会用关键字class来允许子类重写父类的实现方法。
    类型方法和实例方法一样用点号(.)语法调用。

    class Math{
        class func abs(number: Int) -> Int{
            if number < 0{
                return (-number)
            }
            else{
                return number
            }
        }
    }
    struct absno{
        static func abs(number: Int) -> Int{
            if number < 0{
                return (-number)
            }
            else{
                return number
            }
        }
    }
    let no = Math.abs(-35)
    let num = absno.abs(-5)
    print(no)
    print(num)
    *********************************************
    class EquilateralTriangle: NamedShape {
      var sideLength: Double = 0.0
      init(sideLength: Double, name: String) {
      self.sideLength = sideLength
      super.init(name: name)
      numberOfSides = 3
    }
    var perimeter: Double {
      get {
        return 3.0 * sideLength
      }
      set {
        sideLength = newValue / 3.0
      }
    }
    override func simpleDescription() -> String {
      return "An equilateral triagle with sides of length (sideLength)."
      }
    }
    var triangle = EquilateralTriangle(sideLength: 3.1, name: "a triangle")
    print(triangle.perimeter)
    triangle.perimeter = 9.9
    print(triangle.sideLength)
    *****************************************************************
    class TriangleAndSquare {
        var triangle: EquilateralTriangle {
            willSet {
                square.sideLength = newValue.sideLength
            }
        }
        var square: Square {
        willSet {
            triangle.sideLength = newValue.sideLength
        }
    }
        init(size: Double, name: String) {
            square = Square(sideLength: size, name: name)
            triangle = EquilateralTriangle(sideLength: size, name: name)
        }
    }
    var triangleAndSquare = TriangleAndSquare(size: 10, name: "another test shape")
    print(triangleAndSquare.square.sideLength)
    print(triangleAndSquare.triangle.sideLength)
    triangleAndSquare.square = Square(sideLength: 50, name: "larger square")
    print(triangleAndSquare.triangle.sideLength)

    *********************************************************************
    在实例方法中修改值类型
    Swift 语言中结构体和枚举是值类型。一般情况下,值类型的属性不能在它的实例方法中被修改。
    但是,如果你确实需要在某个具体的方法中修改结构体或者枚举的属性,你可以选择变异(mutating)这个方法,然后方法就可以从方法内部改变它的属性;并且它做的任何改变在方法结束时还会保留在原始结构中。
    方法还可以给它隐含的self属性赋值一个全新的实例,这个新实例在方法结束后将替换原来的实例。
    struct area{
      var length = 1
      var breadth = 1
      func area() -> Int{
        return length * breadth
      }
      mutating func scaleBy(res:Int){
        length *= res
        breadth *= res
        println(length)
        println(breadth)
      }
    }
    var a = area(length:3, breadth:2)
    a.scaleBy(3)
    a.length
    a.breadth

  • 相关阅读:
    Actioin<T>委托
    StructLayout特性、、、MashalAs
    ibatis.net存储过程:SqlParameterCollection 中未包含带有 ParameterName“@”的 SqlParamer
    Jquery扩展方法
    XML学习
    CSS实现文字阴影
    FTP概述
    Ajax使用PageMethods调用后台方法
    JSP连接SQL2008
    Ajax Sys.UI.DomElement学习
  • 原文地址:https://www.cnblogs.com/lianfu/p/4999691.html
Copyright © 2011-2022 走看看