基础变量
- let 常量 var变量
- 类型标注 var welcomeMessage: String
数值
- 一个十进制数字,没有前缀
- 一个二进制数,前缀是 0b
- 一个八进制数,前缀是 0o
- 一个十六进制数,前缀是 0x
let@H_502_31@ decimalInteger = 17@H_502_31@
let@H_502_31@ binaryInteger = 0@H_502_31@b10001
let@H_502_31@ octalInteger = 0@H_502_31@o21 // 八进制的17@H_502_31@
let@H_502_31@ hexadecimalInteger = 0x11@H_502_31@ // 十六进制的17@H_502_31@
元组
- 元组(tuples)把多个值组合成一个复合值。元组的值可以是任意类型,并不要求是相同类型
let http404Error = (404@H_502_31@,"Not Fount"@H_502_31@)
//你也可以讲一个元组的内容分解(decompose)成单独的常亮@H_502_31@
let (statusCode,statusMessage) = http404Error
print@H_502_31@("The status code is \(statusCode)"@H_502_31@)
print@H_502_31@("The status message is \(statusMessage)"@H_502_31@)
//如果你只需要一部分元组值,分解的时候可以把要忽略的部分用下划线(_)标记:@H_502_31@
let (justTheStatusCode,_) = http404Error
print@H_502_31@("The status code is \(justTheStatusCode)"@H_502_31@)
//你也可以用下标表示@H_502_31@
print@H_502_31@("The status code is \(http404Error.0)"@H_502_31@)
// 输出 "The status code is 404"@H_502_31@
print@H_502_31@("The status message is \(http404Error.1)"@H_502_31@) // 输出 "The status message is Not Found"@H_502_31@
//定义元组给每个元素定义名字@H_502_31@
let http200Status = (statusCode: 200@H_502_31@,description: "OK"@H_502_31@)
//通过元素名访问元素值@H_502_31@
print@H_502_31@("The status code is \(http200Status.statusCode)"@H_502_31@)
可选类型
- 使用可选链(optionals)来处理值可能缺失的情况
//声明一个变量@H_502_31@
var text@H_502_31@: String
print@H_502_31@(text@H_502_31@) //报错因为text没用值所以会抱错@H_502_31@
var text@H_502_31@: String?
print@H_502_31@(text@H_502_31@) //打印nil@H_502_31@
Swift的nil和Objectivie-C的nil并不一样。在OC中,nil代表一个指向不存在的对象的指针。在Swift中,nil不是指针——它是一个确定的值,用来表示值缺失。任何类型的可选状态都可以被设置为nil,不只是对象类型
当你确定可选类型确实包含值之后,你可以再可选的名字后面加一个感叹号(!)来获取值。这个惊叹号表示”我知道这个可选有值,请使用它。”这被称为可选值的强制解析
断言
let@H_502_31@ age = -3@H_502_31@
assert@H_502_31@(age >= 3@H_502_31@,"A person's age cannot be less than zero"@H_502_31@) //因为age < 0,所以断言会触发@H_502_31@
assert@H_502_31@(age >= 3@H_502_31@) //断言也可以省略信息@H_502_31@
注意
当代码使用优化编译的时候,断言将被禁用,例如Xcode中,使用默认的target Release配置选项来build时,断言将被禁用
函数
var@H_502_31@ mathFunction@H_502_31@: (Int,Int)@H_502_31@ ->@H_502_31@ Int = addTwoInts
print@H_502_31@("Result: \(mathFunction(2,3))"@H_502_31@)
- 函数类型作为参数类型
func printMathResult(mathFunction: (Int,Int) -> Int,_ a: Int,_ b: Int)@H_502_31@ { print@H_502_31@("Result: \(mathFunction(a,b))"@H_502_31@)@H_502_31@ } printMathResult@H_502_31@(addTwoInts,3@H_502_31@,5@H_502_31@)@H_502_31@ // prints@H_502_31@ "Result@H_502_31@: 8"@H_502_31@
- 函数类型作为返回类型(Function Types as Return Types)
func stepForward(input: Int)@H_502_31@ ->@H_502_31@ Int {
return@H_502_31@ input + 1@H_502_31@
}
func stepBackward(input: Int)@H_502_31@ ->@H_502_31@ Int {
return@H_502_31@ input - 1@H_502_31@
}
//@H_502_31@ 根据传入的bool值来返回指定的函数
func chooseStepFunction(backwards: Bool)@H_502_31@ ->@H_502_31@ (Int)@H_502_31@ ->@H_502_31@ Int {
return@H_502_31@ backwards ? stepBackward : stepForward
}
var@H_502_31@ currentValue = 3@H_502_31@
let@H_502_31@ moveNearerToZero = chooseStepFunction(currentValue > 0@H_502_31@)
//@H_502_31@ moveNearerToZero now refers to the stepBackward() function@H_502_31@
- 嵌套函数,嵌套函数可以定义在别的函数体中,默认情况下,嵌套函数对外界是不可见的,但是可以被他们的外围函数(enclosing function)调用。一个外围函数也可以返回它的某个嵌套函数,使得这个函数可以在其他域中被调用
func chooseStepFunction(backwards: Bool)@H_502_31@ ->@H_502_31@ (Int)@H_502_31@ ->@H_502_31@ Int {
func stepForward(input: Int)@H_502_31@ ->@H_502_31@ Int { return@H_502_31@ input + 1@H_502_31@ }
func stepBackward(input: Int)@H_502_31@ ->@H_502_31@ Int { return@H_502_31@ input - 1@H_502_31@ }
return@H_502_31@ backwards ? stepBackward : stepForward
}
var@H_502_31@ currentValue = -4@H_502_31@
let@H_502_31@ moveNearerToZero = chooseStepFunction(currentValue > 0@H_502_31@)
//@H_502_31@ moveNearerToZero now refers to the nested stepForward() function@H_502_31@
while@H_502_31@ currentValue != 0@H_502_31@ {
print@H_502_31@("\(currentValue)... "@H_502_31@)
currentValue = moveNearerToZero(currentValue)
}
print@H_502_31@("zero!"@H_502_31@)
//@H_502_31@ -4.@H_502_31@..
//@H_502_31@ -3.@H_502_31@..
//@H_502_31@ -2.@H_502_31@..
//@H_502_31@ -1.@H_502_31@..
//@H_502_31@ zero!
闭包
- Swift 标准库提供了名为 sort 的方法,会根据您提供的用于排序的闭包函数将已知类型数组中的值进行排序。一 旦排序完成,sort( _ :) 方法会返回一个与原数组大小相同,包含同类型元素且元素已正确排序的新数组。原数组 不会被 sort( _ :) 方法修改。
下面的闭包表达式示例使用 sort( _ :) 方法对一个 String 类型的数组进行字母逆序排序.
func compare(a: Int,b: Int)@H_502_31@ ->@H_502_31@Bool {
return@H_502_31@ a > b
}
var@H_502_31@ newArray = array.sort(compare)
var@H_502_31@ newArray = array.sort { (a,b)@H_502_31@ ->@H_502_31@ Bool in@H_502_31@
return@H_502_31@ a > b
}
print@H_502_31@(newArray.description)
// 我自己写的sort方法@H_502_31@
class@H_502_31@ SwiftClosure@H_502_31@ {@H_502_31@
// 定义一个闭包@H_502_31@
static@H_502_31@ func sort(array@H_502_31@: Array@H_502_31@<Int>,@noescape function@H_502_31@:(a: Int,b: Int)@H_502_31@ -> Bool@H_502_31@) -> Array@H_502_31@<Int@H_502_31@> {@H_502_31@
var@H_502_31@ newArray: Array@H_502_31@<Int>
newArray = []
for@H_502_31@ i in 0.@H_502_31@..array@H_502_31@.count - 1@H_502_31@ {
if@H_502_31@ newArray.count == 0@H_502_31@ {
newArray.append(array@H_502_31@[i])
continue@H_502_31@
}
for@H_502_31@ j in 0.@H_502_31@..newArray.count - 1@H_502_31@ {
if@H_502_31@ function@H_502_31@(a:array[i],b: newArray[j])@H_502_31@ {@H_502_31@
newArray.insert(array@H_502_31@[i],atIndex: j)
break@H_502_31@
} else@H_502_31@ {
newArray.append(array@H_502_31@[i])
break@H_502_31@
}
}
}
return@H_502_31@ newArray
}
}
//@H_502_31@ 外部调用
override func viewDidLoad() {
super@H_502_31@.viewDidLoad()
//@H_502_31@ Do any additional setup after loading the view,typically from a nib.
var@H_502_31@ array@H_502_31@:[Int] = [5@H_502_31@,5@H_502_31@,2@H_502_31@,6@H_502_31@,1@H_502_31@]
array = SwiftClosure.sort(array)@H_502_31@ { (a,b)@H_502_31@ ->@H_502_31@ Bool in@H_502_31@
return@H_502_31@ a > b
}
print@H_502_31@(array.description)
//@H_502_31@ print@H_502_31@ [6@H_502_31@,1@H_502_31@]
}
- 闭包是引用类型,这意味着如果您将闭包赋值给了两个不同的常量或者变量,两个值都会指向同一个闭包
- 非逃逸闭包,当一个闭包作为参数传到一个函数中,但是这个闭包在函数返回之后才被执行,我们称该闭包从函数中逃逸。当你定义接受闭包作为参数的函数时,你可以在参数名之前标注 @noescape,用来指明这个闭包是不允许“逃 逸”出这个函数的。将闭包标注 @noescape 能使编译器知道这个闭包的生命周期(译者注:闭包只能在函数体中 被执行,不能脱离函数体执行,所以编译器明确知道运行时的上下文),从而可以进行一些比较激进的优化。
func someFunctionWithNoescapeClosure(@noescape@H_502_31@ closure: () -> Void)@H_502_31@ { closure@H_502_31@()@H_502_31@ }@H_502_31@
typealias 是用来为已经存在的类型重新定义名字的,通过命名,可以使代码变得更加清晰。使用的语法也很简单,使用 typealias 关键字像使用普通的赋值语句一样,可以将某个已经存在的类型赋值为新的名字
import@H_502_31@ Foundation
//@H_502_31@ 包含Block的类
typealias funcBlock@H_502_31@ = (Array<Int>)@H_502_31@ ->@H_502_31@ ()@H_502_31@ //或者 ()@H_502_31@ ->@H_502_31@ Void
class@H_502_31@ SwiftClosure@H_502_31@ {@H_502_31@
var@H_502_31@ blockD@H_502_31@: funcBlock?
var@H_502_31@ newArray@H_502_31@: Array<Int> = []
//@H_502_31@ 定义一个闭包
func sort(array: Array<Int>,@noescape@H_502_31@ function@H_502_31@:(a: Int,b: Int) -> Bool,block: funcBlock)@H_502_31@ ->@H_502_31@ Void {
newArray = []
for@H_502_31@ i in@H_502_31@ 0.@H_502_31@..array.count - 1@H_502_31@ {
if@H_502_31@ newArray.count == 0@H_502_31@ {
newArray.append(array[i])
continue@H_502_31@
}
for@H_502_31@ j in@H_502_31@ 0.@H_502_31@..newArray.count - 1@H_502_31@ {
if@H_502_31@ function@H_502_31@(a@H_502_31@:array[i],b@H_502_31@: newArray[j]) {
newArray.insert(array[i],atIndex@H_502_31@: j)
break@H_502_31@
} else@H_502_31@ {
newArray.append(array[i])
break@H_502_31@
}
}
}
blockD = block
}
func getNewArray()@H_502_31@->@H_502_31@Void {
blockD!(newArray)
}
}
// 调用含有Block的类@H_502_31@
import UIKit
class@H_502_31@ ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view,typically from a nib.@H_502_31@
let@H_502_31@ array:[Int] = [5@H_502_31@,1@H_502_31@]
let@H_502_31@ swiftClosure = SwiftClosure()
swiftClosure.sort(array,function@H_502_31@: {@H_502_31@ (a,b) -> Bool in@H_502_31@
return@H_502_31@ a > b
}) { (newArray) -> () in@H_502_31@
print(newArray)
}
swiftClosure.getNewArray() // 调用这句话后控制台打印[6,5,2,1]@H_502_31@
}
}