GeekBand.Swift-属性与方法

2016/5/10 posted in  iOS学习笔记  

属性表达实例状态或类型状态
方法是成员函数,表达行为可用于:struct,enum,class

属性

属性类别

根据读写性划分

  • 存储属性
  • 计算属性

根据可变性划分

  • 变量属性
  • 常量属性

根据归属权划分

  • 实例属性
  • 类属性(在struct和enum中用static声明,class中用class声明)

存储属性的本质

一个存储变量,同时编译器会给该变量自动添加get和set访问器方法。

计算属性的本质

一个get方法。(可以添加set)。

class Rectangle{

    //常量属性
    let name:"矩形";
    
    //存储属性(变量属性)
    var width:Int;
    var height:Int;
    //计算属性
    var area:Int{
        get{
            return width*height;
        }
        set{
            self.width = newValue / height;
        }
    }
    
    
}

属性监视器

属性监视器是swift的一个特殊功能,可以在属性值修改之前和之后完成对应动作。

var name:String = "coder"{
    willSet{
        doSomthing();
    }
    didSet{
        doSomthing();
    }
}

注意

实例属性在使用之前必须初始化!

方法

方法的类别

方法根据归属不同可以分为:

  • 实例方法
  • 类型方法

方法的声明

声明代码:func name(参数1,参数2)->返回值{}

说明:

  • 参数形式:外部参数名 本地参数名:类型
  • 声明时可以省略外部参数名,这时外部参数名默认使用本地参数名
  • 调用时,第一个参数名可忽略,但后面的参数名必须显示标明。如果在声明时加_,调用时也可忽略
  • 方法可以没有参数和返回值
  • 参数传递默认为传值

更多参数和返回值功能

  • 提供参数默认值
  • 常量参数与变量参数
  • 可变长参数
  • inout参数,可以改变外部实参
  • 返回元组(Tuple)

class MyClass{
    var instanceData=100;
    static var typeData=10000;
 
    //实例方法
    func instanceMethod(){
        ++instanceData
        ++MyClass.typeData
        instanceMethod2()
        MyClass.typeMethod()
    }
    
    //静态方法
    static func typeMethod(){
        ++typeData
        //++instanceData
        typeMethod2()
        //instanceMethod()
    }
    
    func instanceMethod2(){
        print(instanceData)
    }
    static func typeMethod2(){
        print(typeData)
    }

    //显式内部参数名,省略外部参数名
    func sayGreeting(name:String, _ words:String)->String{
        return words+"! "+name
    }
    func sayGreeting(){
        print("Hello!")
    }
    func sayGreeting(name:String)->String {
        return "Hello! "+name
    }
    //显式内部参数名,显式外部参数名
    func sayGreeting(person name:String,greeting words:String)->String{
        return words+"! "+name
    }
    
    //可变数目参数
    func averageNumber(numbers:Double...)->Double{
    
        var sum=0.0
        for item in numbers {
            sum+=item
        }
        return sum / Double(numbers.count)
    }
    
    //常量参数 VS. 变量参数
    func changeParameter(data1:Int, var data2:Int){
        var dataTemp=data1
        data2++
        dataTemp++
    }

    //inout参数
    func swap(inout a:Int,inout b:Int){
        let tempA=a
        a=b
        b=tempA
    }
    
    //返回Tuple类型
    func minMax(array: [Int]) -> (min: Int, max: Int){
        var currentMin = array[0]
        var currentMax = array[0]
        for value in array[1..<array.count] {
            if value < currentMin {
                currentMin = value
            } else if value > currentMax {
                currentMax = value
            }
        }
        return (currentMin, currentMax)
    }
}

var myObject=MyClass()
//调用实例方法
myObject.instanceMethod()
//调用类型方法
MyClass.typeMethod()
myObject.sayGreeting()
myObject.sayGreeting("Jason")
myObject.sayGreeting("Jason","Welcome")
myObject.sayGreeting(person:"Jason", greeting:"You are welcome")
myObject.averageNumber(10,90,30,80,50,100)
var data1=100
var data2=200
myObject.swap(&data1,b: &data2)
let range=myObject.minMax([3,-9,23,15,-45,7])
print("max=\(range.max), min=\(range.min)")

特殊的方法

初始化器

初始化器用于初始化类型实例,是一个特殊的函数,无返回值。

初始化过程
  1. 分配内存
  2. 调用初始化器初始化内存
应用范围
  • class
  • struct
  • enum
作用
  • 初始化器主要用于初始化实例储存属性,可以使用默认初始化器或自定义的初始化器。
  • 所有储存属性必须被初始化
    • 实例储存属性要么指定默认值,要么在初始化器内初始化
    • 类型存储属性必须指定默认值
  • 可选属性类型可以不初始化。(声明时用修饰)
  • 属性被初始化时,不会调用属性观察者
默认初始化器
  • 一个类可以有多个初始化器,但至少有一个初始化器
  • 如果一个类没有人为提供初始化器,编译器会自动生成一个默认的初始化器
  • 默认初始化器,无参形式init();
便捷初始化器
  • 指定初始化器为类的主初始化器,负责初始化所有属性,默认调用父类的主初始化器
  • 便捷初始化器为类的辅助初始化器。必须调用同的指定初始化器。用convenience修饰
class Point3D{
    var x:Int
    var y:Int
    var z:Int
    
    init(x:Int, y:Int, z:Int){
        self.x=x
        self.y=y
        self.z=z
        
        //other processing
        print("other task")
    }
    
    convenience init(x:Int, y:Int){
        
        self.init(x:x,y:y,z:0)
    }
    
    convenience init(){
        
        self.init(x:0,y:0,z:0)
    }
}

析构器

析构器(deinit),在实例内存被释放前调用,用于释放实例使用的非内存资源。

  • 析构器仅可以定义于class,且只能定义一个。
  • 只有实例析构器,没有类型析构器
  • 析构器运行根据ARC的释放规则,自动调用,程序员无法手动调用
class FileStream{
    init(){
        print("open file...")
    }
    
    func process(){
        print("process file...")
    }
       
    deinit{
        print("close file...")
    }
}