Closed Thons closed 9 years ago
@autoclosure,Swift 1.2 要写在参数名前面
func logIfTrue(@autoclosure predicate: () -> Bool)
本节有 4 处需要修改,整本书没统计。
Swift 的方法命名继承和发扬了这个优点,上面这个方法在 Swift 中的定义是: func writeToFile(path: String!, atomically useAuxiliaryFile: Bool, encoding enc: NSStringEncoding, error: NSErrorPointer = default) -> Bool
Swift 的方法命名继承和发扬了这个优点,上面这个方法在 Swift 中的定义是:
func writeToFile(path: String!, atomically useAuxiliaryFile: Bool, encoding enc: NSStringEncoding, error: NSErrorPointer = default) -> Bool
第一个参数应该改为 path: String,(终于)不是隐式拆包的类型了。
path: String
附带 Swift 1.2 的 Xcode 6.3 beta 已经支持直接在命令行输入 swift 就能启动 REPL 了,不需要 xcrun swift。同理,下面的代码就可以去掉 xcrun,直接写 #!/usr/bin/env swift
swift
xcrun swift
xcrun
#!/usr/bin/env swift
// hello.swift #!/usr/bin/env swift println("hello")
swiftc 也不需要 xcrun 在前面了,直接写 swiftc MyClass.swift main.swift。此外,swiftc -O hello.swift > hello.asm 输出的 asm 文件是空的。
swiftc
swiftc MyClass.swift main.swift
swiftc -O hello.swift > hello.asm
Swift 1.2 支持类中的静态存储属性,这样单例就可以这么写了:
class MyManager { private static let sharedInstance = MyManager() class var sharedManager : MyManager { return sharedInstance } }
依然没有 class let 或者 class var,static 关键字在这里是 class final 的别名,所以 MyManager 子类是不能 override 这个属性的,但是不管怎么说,这算是一个进步了。
class let
class var
static
class final
MyManager
override
Swift 1.2 中,
UIApplicationMain(C_ARGC, C_ARGV, nil, NSStringFromClass(AppDelegate))
要改为
UIApplicationMain(Process.argc, Process.unsafeArgv, nil, NSStringFromClass(AppDelegate))
因为 Swift 1.2 支持类中的静态存储属性和静态方法,所以这节有必要得加上这方面的内容了~~
init 方法参数名由 value 变成了 source
init
value
source
struct COpaquePointer : Equatable, Hashable, NilLiteralConvertible { //.. init<T>(_ source: UnsafePointer<T>) //.. }
Swift 1.2 中,_stdlib_getTypeName 已经阵亡了,Swift 值类型,可以直接使用 .dynamicType,效果等同于 _stdlib_getDemangledTypeName,dynamicType 现在全类型支持了。_stdlib_xxxx 这些东西可以忘掉了。
_stdlib_getTypeName
.dynamicType
_stdlib_getDemangledTypeName
dynamicType
_stdlib_xxxx
从 Swift 1.2 开始,向下转换必须使用 as!,所以
as!
Swift 中使用 as 关键字做类型转换
这句话就得改改了。
下面的强制转换代码改成:
for view in self.view.subviews as! [UIView] { view.backgroundColor = UIColor.redColor() }
判断是否为 NaN,也可以使用 isnan: 这个全局函数,不一定非得自己和自己相比
isnan:
//Module-Bridging-Header.h #import "miao.h"
改为 #import "test.h"
#import "test.h"
本节描述的事情,与 Swift 1.2 里表现不一致,倘若我们的调用代码是
3.times { i in println(i) }
那么 Int 扩展里的 3 个 times: 方法,如果不注释掉其余两个,是不能编译的,所以如果不改动或注释掉第一个 times: 方法,新加一个同名不同参的方法是不行的。这样的话,就不会出现书中描写的第一个情况
times:
我们在没有改变原来的代码的情况下,仅仅是加入了新的方法就让原来的代码失效了
但是第二个情况
我们又加入了一个这样看起来是“接受两个参数”的闭包的版本……我们可以看到 i in 这种接受一个参数的调用仍然可以编译和运行
这句话依然奏效。
我不清楚是我没有领会作者的意思,还是当时写这本书的时候第一个情况是存在的。
哇...感谢提交!尽快修正...
闭包歧义那一节 Apple 每次都在改...一开始1.0的时候非常严格,然后1.1的时候改了一次放宽了一些。1.2的话其实最近挺忙我还没有仔细深入,需要回头再探索一下。
其他几处修改的建议十分感谢!
好的。总而言之,这门语言远没有乍一看的时候那么简单。 甭管东瀛过不过春节,新年快乐。
All fixed in 1.2.1
@autoclosure 和 ??
@autoclosure,Swift 1.2 要写在参数名前面
本节有 4 处需要修改,整本书没统计。
方法参数名称省略
第一个参数应该改为
path: String
,(终于)不是隐式拆包的类型了。Swift 命令行工具
附带 Swift 1.2 的 Xcode 6.3 beta 已经支持直接在命令行输入
swift
就能启动 REPL 了,不需要xcrun swift
。同理,下面的代码就可以去掉xcrun
,直接写#!/usr/bin/env swift
swiftc
也不需要xcrun
在前面了,直接写swiftc MyClass.swift main.swift
。此外,swiftc -O hello.swift > hello.asm
输出的 asm 文件是空的。单例
Swift 1.2 支持类中的静态存储属性,这样单例就可以这么写了:
依然没有
class let
或者class var
,static
关键字在这里是class final
的别名,所以MyManager
子类是不能override
这个属性的,但是不管怎么说,这算是一个进步了。@UIApplicationMain
Swift 1.2 中,
要改为
static 和 class
因为 Swift 1.2 支持类中的静态存储属性和静态方法,所以这节有必要得加上这方面的内容了~~
COpaquePointer 和 CFunctionPointer
init
方法参数名由value
变成了source
获取对象类型
Swift 1.2 中,
_stdlib_getTypeName
已经阵亡了,Swift 值类型,可以直接使用.dynamicType
,效果等同于_stdlib_getDemangledTypeName
,dynamicType
现在全类型支持了。_stdlib_xxxx
这些东西可以忘掉了。类型转换
从 Swift 1.2 开始,向下转换必须使用
as!
,所以这句话就得改改了。
下面的强制转换代码改成:
数学和数字
判断是否为 NaN,也可以使用
isnan:
这个全局函数,不一定非得自己和自己相比C 代码调用和 @asmname
改为
#import "test.h"
闭包歧义
本节描述的事情,与 Swift 1.2 里表现不一致,倘若我们的调用代码是
那么 Int 扩展里的 3 个
times:
方法,如果不注释掉其余两个,是不能编译的,所以如果不改动或注释掉第一个times:
方法,新加一个同名不同参的方法是不行的。这样的话,就不会出现书中描写的第一个情况但是第二个情况
这句话依然奏效。
我不清楚是我没有领会作者的意思,还是当时写这本书的时候第一个情况是存在的。
全书还有四五个错别字,本来已经记下了,结果忘记记哪儿去了,找不到当时记的位置了,等别人提交 Issue 吧 T_T