swift初学总结

原创
2014/08/17 00:10
阅读数 38

自从苹果公司发布了新的编程语言swift,让我提起了更大的兴趣,初看swift的文档,发现swift与JavaScript语言的有点相似,有点类似脚本语言了。

支持swift开发的ide为xcode 6 beta 

刚开始学,随便写写吧

swift函数:swift函数可以存在在struct结构体里,也可以存在在calss里,还可以独立的写,不依附与具体的结构体和类

(这一点有点像oracle中定义函数的意思,可以依附于type,也可以独立的function)

声明一个函数:

func someFunction(args: Int,outArgs b:Double,#inout:String,ifchonse a: String = "你好") 
   -> Int{
    //此处定义了有四个参数的一个函数,返回值是一个Int类型,四种不同的参数写法,
    //args参数,类型为Int类型,这个参数的名是内部参数明,当然也可以用作外部参数名,如果只含有一个参数名的
    println(args)
    //outArgs b 参数,类型为Double类型,outArgs为外部参数名,b为内部参数名,调用这个函数时可以这样调用
    //someFunction(3,outArgs : 2.5,inout: "你是谁"),在内部使用第二个参数时,参数名为b
    println(b)
    //参数名前加#号,可以当作内部外部参数,最后一个参数是可有可无的,没有传递最后一个参数时,最后一个参数默认为 “你好”
    
    
    return 33
}

函数类型:一个函数可以看作一个类型,for example

func add(a: Int, b: Int) -> Int{
    return a+b
}
func reduce(a:Int, b: Int) -> Int{
    return a-b
}
//以上这两个函数的格式都是(Int,Int) -> Int ,所以这两个函数都有一个相同的类型,函数类型也是一种类型,所以可以有更多地灵活用法

var ownFunction:(Int, Int) -> Int //声明一个函数类型的变量
if condition {
    ownFunction = add         //给函数类型的变量赋值
}else{
    ownFunction = sub
}
let result = ownFunction(3,5) //执行函数的

函数还可以当作参数,也可以当作返回值
func addAge(age: Int, age2: Int) -> Int{
    return age+Int(age2)
}

func hasFuncArgsFunction(a:Bool, #callback:(Int,Double) -> Int) -> (Int,String) ->Int{
    if a {
        let result = callback(3,3.5)
        return func reFunc(age:Int, name:String) -> Int{
            return age+result
        }
    }else{
        return func reFunc(age: Int, name:String) -> Int{
            return age
        }
    }
}
//调用上面的函数
var resultFunction  = hasFuncArgsFunction(a:true,callback:addAge)
//这里会得到一个函数,函数最后返回的是一个Int值
var overResult = resultFunction(age: 55,name: "小飞")
//这里貌似还有一个闭包,内部返回函数,引用到了hasFuncArgsFunction函数里面的一个常量,swfit这么灵活的的函数//方式,估计以后会有很多复杂的函数问题,函数中可以返回函数,返回的函数还可以返回函数,还好返回类型确定了,要是//跟js一样返回值不确定会是什么,那样很可能造成运行。看了几天,swift并不是若类型语言,而是很强的强类型语言,起//码比java类型约束强

swift内存管理机制方式,也许是借鉴的javaScript引用计数,但回收机制却不一样,js回收是利用gc来在不定期间回收内存中引用数为0的内存对象,swift在引用计数为0时,会立刻把该对象在内存内移除,而曾经在js中引起内存泄露的循环引用问题,在swift语言中采用弱引用也很好的得到了解决,写个例子

class Dog{
    var host: Person?
}

class Person{

    var hony: Dog?
    
    func getDog(dog:Dog){
        hony = dog
        dog.host = self
    }
}
//可选属性,可以不初始化属性
var person = Person() //Person被 person引用,计数++
var dog = Dog()       //Dog被 dog引用,计数++
//由于对象类型是按引用传递的,这里host会引用到Person,hony会引用到Dog,这种引用是一种强引用,会造成这两个对象的引用计数+1
person.getDog(dog:dog)

//当运行完该程序,person,dog不再指向内存中的Person对象和Dog对象,然而两个内存中的对象的引用计数不是0
//这样这两个对象会一直会存在在内存中,直到整个程序退出,这样会造成内存泄露

弱引用:一种可以不用增加对象的引用计数的方式
cLass Dog{
    weak var host: Person?
}
class Person{
    weak var dog: Dog?
    
    func getDog(dog: Dog){
        dog = dog
        dog.host = self
    }
}
//采用关键字weak,可以让引用变成弱引用,引用计数不会+1,当Person的引用计数变为0时,Dog的host会被赋值为nil
//,因此弱引用必须为可选值,
误导了请谅解,swift菜鸟中。。。。

待续。。。






















展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部