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

原文地址:https://www.cnblogs.com/lianfu/p/4999691.html