您的位置:首页 > 移动开发 > Swift

Swift——(五)Swift中的那些默认值

2014-06-23 22:59 197 查看
在Swift语言中,有很多默认值,这里将常用的总结,欢迎补充。
@Author: twlkyao转载或者引用请保留此行。

1.函数(方法)形参

在函数(方法)中,形参默认是常量,不可以在函数(方法)内部进行修改,这主要是为了防止误操作,防止在调用函数(方法)时改变了实参的值,所以使用常量,如果想在函数内部对实参进行修改,可以使用var关键字进行标识,但是这并没有结束,在函数(方法)外部,实参仍然未改变。如果想在函数(方法)调用结束之后仍然可以使用修改后的值,需要使用inout关键字进行标识,同时不要使用对形参进行标识,在调用函数(方法)的时候,传递的实参,需要使用"&"进行标识,类似于C、C++中的引用传递。
func swap(a: Int, b: Int){  
    let c = a  
//    a = b  // can't assign to `let` value `a`.
//    b = c  // can't assign to `let` value `a`.
}
如上代码,会出现编译错误,因为a和b默认是常量,不可以修改,如果想修改a和b,可以将代码更改如下:

func swap(var a: Int, var b: Int){
    let c = a
    a = b
    b = c
}
var a = 3
var b = 2
swap(a, b) // a = 3, b = 2

在如上代码中,形参a和形参b默认都是常量,如果需要a和b的值在函数内部可变,需要使用var关键字进行标识,函数实现两个整数交换,可是在函数外部,两个整数还是原值,如果想要修改之后的值可以在函数外部访问,需要添加inout关键字,并将var关键字删除。
func swap(inout a: Int, inout b: Int){
    let c = a
    a = b
    b = c
}
var a = 3
var b = 2
swap(&a, &b) // a = 2, b = 3

2.属性观察器

在Swift中可以为除了lazy的存储属性(stored property)和继承来的属性设置属性观察器,来观察属性值的变化,观察器有两种,willSet和didSet。willSet在属性值被改变之前调用,didSet在属性值被改变之后进行调用。 注:这里说的是改变,而不是设置,因为在初始化的时候,是不会调用这两个函数的。并且如果在didSet中,修改了属性值,也不会再次调用willSet和didSet。属性观察器,willSet中,即将设置的值默认为newValue(可以自己设置参数名),didSet中,设置之前的值默认为oldValue(可以自己设置参数名)。
class StepCounter {
    var totalSteps: Int = 0
    willSet(newTotalSteps){
        println("About to set totalSteps to \(newTotalSteps)") // you can use newValue if you does not set a name with newTotalSteps
    }

    didSet{
        if totalSteps > oldValue {
            println("Added \(totalSteps - oldValue) steps")
        }
    }
}

let stepCounter = StepCounter() // no output since it is the initialiser, not change the value.
stepCounter.totalSteps = 200 // print both the willSet's and didSet's output.

在如上的代码中,willSet设置了新的参数名:newTotalSteps,didSet使用默认参数名:oldValue。

3.可选类型

这里先进行声明,在Swift中,可选类型是和其它类型不一样的(好像废话一样),例如:Int和Int?是完全不同的类型,如果想使用Int?类型的值,需要进行可选绑定或者强制解析(在进行强制解析的时候要确保该可选类型当前有值,否则会产生运行时错误),才能得到可选类型真正的值。
class Optional{
    var a: Int?
    var b: Int
}

在如上代码中,变量a是有默认值nil的,如果想获得a的值,需要使用如下代码。
a = 10
// optional binding.
if let c = a {
    println("\(c)")
} else {
    println("a is nil")
}

// forced unwrapping, might cause an runtime error if a is nil.
let d = a!

4.计算属性的setter

在计算属性中,属性的setter中,将要设置的新值默认为newValue。
struct Circle {
    var radius: Float
    var diameter: Float {
        get{
            return 2.0 * radius
        }
        set{
            radius = newValue / 2.0
        }
    }
}
如上代码中,没有设置参数名,使用默认的值:newValue。为了便于理解,可以设置新的参数名。
struct Circle {
    var radius: Float
    var diameter: Float {
        get{
            return 2.0 * radius
        }
        set(newDiameter){
            radius = newDiameter / 2.0
        }
    }
}

——————————Update 2014.06.30——————————

5.构造器

在Swift中,因为构造器在括号前没有函数名来标识构造器,所以构造器中的参数对构造器很重要,因此Swift默认为构造器提供了和内部参数名相同的外部参数名。从而在调用的使用也必须使用外部参数名。
struct Color {
    let red = 0.0, green = 0.0, blue = 0.0
    init(red: Double, green: Double, blue: Double) {
        self.red = red
        self.green = green
        self.blue = blue
    }
}

let magenta = Color(red: 1.0, green: 0.0, blue: 1.0)
// let veryGreen = Color(0.0, 1.0, 0.0) // will result compile error.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: