类的最基本特性就是封装, Swift 的类可以想见就是把 let 的常量, var 的变量, func 的方法写在 class 定义里。 在此之上就涉及变、常量的初始,实例的初始化。Swift 的类定义与 Java 相比还是有些特别的地方,如属性不存在默认值, 必须在构造函数中初始化; 构造函数还是沿用了 Objective-C 的方式,名称都是 init; 实例化时不需要 new 等等。
Swift 的类终于不用像 Objective-C 那样接口定义和实现分开来写了。
下面尽量用一个类声明来说明 Swift 类和对象更多的问题 Read More
- 咋一眼看到 Swift @autoclosure 自动闭包便不由自主的联想到 Scala 的 Call-By-Name 求值策略。既然主要话题是关于 Swift 的,那还是 Swift 的 @autoclosure 先入为主,下面例子中的
greet(name: () -> String)接收一个闭包作为参数1func greet(name: () -> String) { 2 print("Hello \(name())") 3} 4 5greet({() in return "Swift"}) //标准 6greet({return "Swift"}) //简化 7greet({"Swift"}) //再简化 8 9greet{"Swift"} //因为 greet 只有一个参数,因而可以这样写
对greet(_:)的函数调用不断简化,最后简化为greet{"Swift}。总而言之大括号是甩不了了,有大括号的围绕才叫闭包。
同时我们依据闭包的简化规则倒退发现:给任何一个表达式两边加上大括号 {},就构成了一个闭包,它是无参数的闭包,返回值可有可无。例如 {1+2}, {foo(10)+5}, {print("Hello")}, {array.removeAtIndex(0)} 等等
至此,我们还未死心,思考能不能对 greet{"Swift"} 的写法进一步简化,这就要请出 @autoclosure 隆重登场, 对 greet() 的 name 参数前加上 @autoclosure, 就是 Read More - 谈到函数式编程,恐怕最不能放过的就是闭包。闭包的定义总是不那么清晰,好像每种语言都有小许的差别。通常说的是可以捕获(访问)外部变量语句块,Swift 的闭包类似于 Objective-C 的 Block 或其他语言的 Lambda 表达式。所以闭包同 Lambda 基本上是同义词。
现在还没完, Swift 认为全局函数(有名字的,不能捕获外部变量)和嵌套函数(有名字,可捕获外部变量)也认为是特殊的闭包。闭包表达式(无名字的闭)才是真正意义上的闭包,它用最简洁的方式来书写一个函数。因此它尽了最大的可能的作了约定性的简化,例如参数与返回类型的推断,return 的省略,无参或只有一个参数的简化。
闭包的语法形式
{ (parameters) ->returntypein
statements
}
闭包中可用常量参数(let),变量参数(var), inout 参数,甚至是可变个数参数,但是不能用默认参数。说白了,闭包也就是无名函数的另一种写法。 Read More - 正好前段时间在发力理解函数式编程,学习 Swift 至今就想看看 Swift 对函数式编程的支持如何。从变量声明用 let, 以及函数参数的 let 和 var 都非常适合于函数式编程,它们对实例保护的很好。let 和 var 类型的函数参数保证了函数内部操作的是传入参数的深拷贝。
在 Objective-C 中要调用一个函数,除了通过对像为媒介,还能 perform 一个 selector, selector 其实也是定位函数的方式,这更像是反射。其实 C/C++ 的函数指针概念更不错,用于直接定位函数。
所以进一步,函数要成为第一等公民,它本身可以很容易的作为参数传入或作为返回值,即能构成高阶函数。这在 Swift 也是没问题的,我们可以定义函数类型的变量,例如:1func addTwoInts(a: Int, _ b: Int) -> Int { 2 return a + b 3} 4 5var addFunction: (Int, Int) -> Int = addTwoInts //addTwoInts 函数类型表示 (Int, Int) -> Int 6print(addFunction(1, 2)) 7let add = addTwoInts //自动推断出 add 函数的类型 8 9func foo() { 10 print(123) 11} 12let f:()->Void = foo
Read More - 由于 Swift 出自于名门 Apple,与 Objective-C 共同服务于 iOS/Mac OS X 平台,因而看得出它更像是脱胎于 Objective-C。现在来学习它的函数相关的知识,Swift 函数定义有些像 Scala,只是用 func 替代了 def, 返回类型的指定用的是
->而不是=, 格式如下:1func greet(name: String, day: String) -> String { 2 return "Hello \(name), today is \(day)" 3} 4 5greet("Bob", day: "Tuesday")
当然函数无参数就是空括号(不能省略空括号),无返回值的话就无需->指定类型了,比如 func greet() { print("Hello")},从形式上看不出是否有副作用(纯函数)
调用函数时和 Objective-C 是一样的,除第一个参数不需要指定形参名,其他参数必须指定形参名,并且顺序是要和函数定义时完全一样的。我们知道在 Objective-C 中一般约定把第一次参数包含在方法名中,如 Read More