1、闭包,通过闭包对字符串数组进行排序,闭包的函数体部分由关键字in引入
names.sort( { (s1: String,s2: String) -> Bool in return s1 < s2 } )
names.sort( { s1,s2 in return s1 > s2 } )(类型推断,推断参数类型)
names.sort( { s1,s2 in s1 > s2 } )(隐式返回,推断返回什么类型)
names.sort( { $0 > $1 } ) (参数名缩写,参数顺序调用)
names.sort(>)(运算符函数,swift自动推断)
2、尾随闭包的使用
let digitNames = [ 0: "Zero",1: "One",2: "Two",3: "Three",4: "Four",5: "Five",6: "Six",7: "Seven",8: "Eight",9: "Nine" ] let numbers = [16,58,510] let strings = numbers.map { (var number) -> String in var output = "" while number > 0 { output = digitNames[number % 10]! + output number /= 10 } return output } println(strings) 输出:[OneSix,FiveEight,FiveOneZero]
3、嵌套函数的捕获值
//传入Int ,返回()->Int //被传入的Int被潜逃函数捕获,并持有,不断累加。 func makeIncrementor(forIncrement amount: Int) -> () -> Int { var runningTotal = 0 func incrementor() -> Int { runningTotal += amount return runningTotal } return incrementor } override func viewDidLoad() { super.viewDidLoad() let dd = makeIncrementor(forIncrement: 7) println(dd()) //7 println(dd()) //14 let ee = dd println(ee()) //214、Swift 中字符串(String),数组(Array)和字典(Dictionary)类型均以结构体的形式实现。这意味着String,Array,Dictionary类型数据被赋值给新的常量或变量,或者被传入函数或方法中时,它们的值会发生拷贝行为(值传递方式)。 5、延迟存储属性(lazy)来避免复杂类中不必要的初始化。 6、可以通过把方法,属性或下标脚本标记为final来防止它们被重写 7、循环引用的解决方式 Person和Apartment的例子展示了两个属性的值都允许为nil,并会潜在的产生循环强引用。这种场景最适合用弱引用来解决。 Customer和CreditCard的例子展示了一个属性的值允许为nil,而另一个属性的值不允许为nil,这也可能会产生循环强引用。这种场景最适合通过无主引用来解决。 两个属性都必须有值,并且初始化完成后永远不会为nil。在这种场景中,需要一个类使用无主属性,而另外一个类使用隐式解析可选属性。 解决闭包引起的循环强引用,通过定义捕获列表。 8、internal:可以访问自己模块中源文件里的任何实体,但是别人不能访问该模块中源文件里的实体。 9、Swift中的private访问和其他语言中的private访问不太一样,它的范围限于整个源文件,而不是声明。 10、元组的访问级别与元组中访问级别最低的类型一致。 11、子类的访问级别不得高于父类的访问级别。