Swift is an innovative new programming language for Cocoa and Cocoa Touch. Writing code is interactive and fun, the syntax is concise yet expressive, and apps run lightning-fast. Swift is ready for your next iOS and OS X project — or for addition into your current app — because Swift code works side-by-side with Objective-C.
—— developer.apple.com
简单值(Simple Values)
在Swift中包含常量和变量两种类型的值。用let声明常量,用var声明变量。常量一旦赋值变不可改变。声明变量时,既可以显式的声明变量类型,也可以让编译器自己推断类型。
var myVariable = 42 myVariable = 50 let myConstant = 42 let implicaitInteger = 70 let explicitDouble: Double = 70
使用方括号 []
来创建数组和字典,并使用下表或者键来访问元素。同理,初始化数组或字典时,如果可以推断出数据类型,则无需显式声明类型。
var shoppingList = ["catfish","water","tulips","blue paint"] let emptyDictionary = [String: Float]() occupations = [:]
控制流(Control Flow)
常用的控制流有 if
、 switch
、 for-in
、 while
、 do-while
等。
其中,if语句的条件必须是一个布尔表达式;同时我们也可以通过一起使用if和let来处理值缺失的情况。有些变量的值是可选得,一个可选的值可能是一个具体的值或者是 nil
,表示值缺失。在类型后面加一个问号来标记这个变量的值是可选的。
var optionalName: String? = "John Appleseed" var greeting = "Hello" if let name = optionalName { greeting = "hello,/(name)" }
如果变量的可选值是nil,条件会判断为false,大括号中的代码不会执行,如果不是nil,那么会将值赋给let后面的常量,这样代码块中就可以使用这个值了。
在 switch
语句中,当某一个case匹配时,程序会自动退出switch语句,所以无需在每个case结尾都写break了。
在循环中可以使用 ..<
来表示范围:
var firstForLoop = 0 for i in 0..<4 { firstForLoop += i }
其他的控制语句与常用方法类似。
函数和闭包(Functions and Closures)
在Swift中,使用func来声明一个函数。
- 使用
->
来指定函数的返回值,一个函数可以有多个返回值,多个返回值需要放在一个元组中 - 函数可以带有可变个数的参数,这些参数在函数内表现为数组的形式
- 函数可以被嵌套
-
函数可以作为另一个函数的返回值
func makeIncrementer()->(Int->Int){ func addOne(number:Int)->Int{ return 1 + number } return addOne } var increment = makeIncrementer() increment(7)
-
函数也可以当做参数传入另一个函数
func hasAnyMatches(list:[Int],ocndition:Int->Bool)->Bool{ for item in list { if condition(item){ return true } } return false } func lessThanTen(number:Int)->Bool{ return number < 10 } var numbers = [20,19,7,12] hasAnyMatches(numbers,lessThanTen)
函数实际上是一种特殊的闭包,我们可以使用 {}
来创建一个匿名闭包。使用in将参数和返回值类型声明与闭包函数体进行分离。如果一个闭包的类型已知,可以忽略参数的类型和返回值。我们可以通过参数位置而不是参数名字来引用参数。
下面的两段代码是等价的:
numbers.map({ (number:Int)->Int in let result = 3 * number return result }) numbers.map({ number in 3 * number })
对象和类(Objects and Classes)
使用 class
和类名来创建一个类。要创建一个类的实例,在类名后面加上括号。使用 .
来访问实例的属性和方法。
通过在类名后面加上父类的名字定义子类,用冒号分割。子类如果要重写父类的方法,需要用 override
标记。
override func simpleDescription()->String} ... }
属性可以有getter和setter方法。也可以通过使用willSet和didSet来实现在设置一个新值之前或者之后运行代码。
枚举和结构体(Enumerations and Structures)
使用 enum
来创建一个枚举。枚举可以包含方法。
使用 struct
来创建一个结构体。结构体和类之间最大的区别就是结构体是传值,类是传引用。
协议和扩展(Protocols and Extensions)
使用 protocol
来声明一个协议。类、枚举和结构体都可以实现协议。
protocol ExampleProtocol{ var simpleDescription: String{ get } mutating func adjust() }
泛型(Generics)
在尖括号里写一个名字来创建一个泛型函数。
func repeat<ItemType>(item: ItemType, times: Int) -> [ItemType] { var result = [ItemType]() for i in 0..<times { result.append(item) } return result } repeat("knock",4)
《The Swift Programming Language》 阅读总结