swifter-tips / Public-Issues

Public issues for Swifter-tips book
103 stars 3 forks source link

兼容 Swift 1.2 和其它小错误 #22

Closed Thons closed 9 years ago

Thons commented 9 years ago

@autoclosure 和 ??

@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

第一个参数应该改为 path: String,(终于)不是隐式拆包的类型了。


Swift 命令行工具

附带 Swift 1.2 的 Xcode 6.3 beta 已经支持直接在命令行输入 swift 就能启动 REPL 了,不需要 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 文件是空的。


单例

Swift 1.2 支持类中的静态存储属性,这样单例就可以这么写了:

class MyManager  {
    private static let sharedInstance = MyManager()
    class var sharedManager : MyManager {
        return sharedInstance 
    }
}

依然没有 class let 或者 class varstatic 关键字在这里是 class final 的别名,所以 MyManager 子类是不能 override 这个属性的,但是不管怎么说,这算是一个进步了。


@UIApplicationMain

Swift 1.2 中,

UIApplicationMain(C_ARGC, C_ARGV, nil, NSStringFromClass(AppDelegate))

要改为

UIApplicationMain(Process.argc, Process.unsafeArgv, nil, NSStringFromClass(AppDelegate))

static 和 class

因为 Swift 1.2 支持类中的静态存储属性和静态方法,所以这节有必要得加上这方面的内容了~~


COpaquePointer 和 CFunctionPointer

init 方法参数名由 value 变成了 source

struct COpaquePointer : Equatable, Hashable, NilLiteralConvertible {
    //..
    init<T>(_ source: UnsafePointer<T>)
    //..
}

获取对象类型

Swift 1.2 中,_stdlib_getTypeName 已经阵亡了,Swift 值类型,可以直接使用 .dynamicType,效果等同于 _stdlib_getDemangledTypeNamedynamicType 现在全类型支持了。_stdlib_xxxx 这些东西可以忘掉了。


类型转换

从 Swift 1.2 开始,向下转换必须使用 as!,所以

Swift 中使用 as 关键字做类型转换

这句话就得改改了。

下面的强制转换代码改成:

for view in self.view.subviews as! [UIView] { 
    view.backgroundColor = UIColor.redColor()
}

数学和数字

判断是否为 NaN,也可以使用 isnan: 这个全局函数,不一定非得自己和自己相比


C 代码调用和 @asmname

//Module-Bridging-Header.h 
#import "miao.h"

改为 #import "test.h"


闭包歧义

本节描述的事情,与 Swift 1.2 里表现不一致,倘若我们的调用代码是

3.times { i in
    println(i)
}

那么 Int 扩展里的 3 个 times: 方法,如果不注释掉其余两个,是不能编译的,所以如果不改动或注释掉第一个 times: 方法,新加一个同名不同参的方法是不行的。这样的话,就不会出现书中描写的第一个情况

我们在没有改变原来的代码的情况下,仅仅是加入了新的方法就让原来的代码失效了

但是第二个情况

我们又加入了一个这样看起来是“接受两个参数”的闭包的版本……我们可以看到 i in 这种接受一个参数的调用仍然可以编译和运行

这句话依然奏效。

我不清楚是我没有领会作者的意思,还是当时写这本书的时候第一个情况是存在的。


全书还有四五个错别字,本来已经记下了,结果忘记记哪儿去了,找不到当时记的位置了,等别人提交 Issue 吧 T_T
onevcat commented 9 years ago

哇...感谢提交!尽快修正...

onevcat commented 9 years ago

闭包歧义那一节 Apple 每次都在改...一开始1.0的时候非常严格,然后1.1的时候改了一次放宽了一些。1.2的话其实最近挺忙我还没有仔细深入,需要回头再探索一下。

其他几处修改的建议十分感谢!

Thons commented 9 years ago

好的。总而言之,这门语言远没有乍一看的时候那么简单。 甭管东瀛过不过春节,新年快乐。

onevcat commented 9 years ago

All fixed in 1.2.1