苹果新编程语言Swift,从开始研发到最终发布仅用了不足4年时间。该语言背后的创造者为苹果开发者工具部门总监克里斯·拉特纳(Chris
Lattner),根据其在博客上的表述,Swift的底层架构大多由其一人开发完成,而开发期间,仅少数内部人士对此项目知晓。
Swift语言开发工作是从2010年7月开始,但直到2013年才获得了苹果开发者工具部门的重视。拉特纳表示,大多数早期架构的开发是由其个人独自完成的,但到了2011年末,一些非常优秀的工程师开始为该项目提供贡献,这才使得Swift获得了部门的重视。
与其他编程语言一样,Swift受益于其他语言那些来之不易的开发经验。Xcode Playgrounds功能是拉特纳的最爱,也是Swift为苹果开发工具带来的最大创新。该功能提供了不可思议的互动效果,能让Swift代码在编写过程中实时的编译和显示。
拉特纳强调,Playgrounds的功能很大程度是受到了布雷特·维克多(Bret Victor)理念、透写光台以及其他一些互动系统的启发。而将编程变得更加平民化和有趣,拉特纳认为这有助于苹果吸引到下一代的程序员们,甚至让大学重新制定计算机科学专业的课程内容。
Swift语言使用var定义变量,但和别的语言不同,Swift里不会自动给变量赋初始值,也就是说变量不会有默认值,所以要求使用变量之前必须要对其初始化
全局函数都是闭包,特点是有函数名但没有捕获任何值。
嵌套函数都是闭包,特点是有函数名,并且可以在它封闭的函数中捕获值。
{ (parameters) ->return typein
statements
}
闭包的函数体部分由关键字 in引入。
let names = ["Chris","Alex","Ewa","Barry","Daniella"]
func backwards(s1:String, s2:String) ->Bool {
return s1 > s2
}
var reversed =sort(names,backwards)
println(names)
reversed =sort(names, { (s1:String, s2:String) -> Boolin
return s1 > s2
})
println(names)
reversed =sort(names, { s1, s2inreturn s1 > s2 } )
println(names)
reversed =sort(names, { s1, s2in s1 > s2 } )
println(names)
下标语法,通过使用subscript关键定义
subscript(index:Int) -> Int {
get {
// return an appropriate subscript value here
}
set(newValue){
// perform a suitable setting action here
}
}
subscript(index:Int) -> Int {
// return an appropriate subscript value here
}
struct Matrix
{
let rows: Int, columns:Int
var grid: Double[]
init(rows: Int, columns:Int) {
self.rows = rows
self.columns = columns
grid = Array(count: rows * columns, repeatedValue:0.0)
}
func indexIsValidForRow(row: Int, column: Int) -> Bool {
return row >= 0 && row <rows && column >= 0 && column < columns
}
subscript(row: Int, column:Int) -> Double {
get {
assert(indexIsValidForRow(row, column: column),"Index out of range")
return grid[(row *columns) + column]
}
set {
assert(indexIsValidForRow(row, column: column),"Index out of range")
grid[(row * columns) + column] = newValue
}
}
}
var matrix =Matrix(rows: 2, columns:2)
matrix[0,1] = 1.5
matrix[1,0] = 3.2
println(matrix.grid)
重写一个由继承而来的方法需要在方法定义前标注override关键词。
还可以在类关键词class前使用@final标记一整个类为final(@final
class)。任何子类尝试继承这个父类时都会在编译时报错。你可以通过标记final关键词来禁止重写一个类的方法,属性或者下标。在定义的关键词前面标注@final属性即可。