swifter-tips / Public-Issues

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

一些 Swift 3 后 swifter-tips 的问题 #63

Closed FrainL closed 7 years ago

FrainL commented 8 years ago

p63
重载~= 的部分【StringLiteralConvertible 】 应该是 swift 3 的 ExpressibleByStringLiteral

p70 “希望你还记得我们在【对象类型】中所提到的” 对象类型是下文内容,这个表述有一定问题

p92 函数部分 第二段代码部分【CollectType】以及 【map】 还是 swift 2 的版本,以及 map 函数应该是在 Sequence 中的

p142 中注释部分 “这不是 Swift 的方法,而是本书在【延时调用】一节中实现的一个方法” delay 是前文已经使用 GCD 实现的一个方法,这样写是不是有些不太妥当?

p182 中的注释部分 “如果您对参数的默认值的 default 感兴趣的话,可以看看【默认参数】一节的内容,有简单的介绍” 也是表述的问题,默认参数一节已经在 59页 讲过,当然这样说也没有错

p198 JSON 部分 “举个例子,我们使用 【NSJSONSerialization】 解析完一个 JSON 字符串后,得到的是 【AnyObject】” Swift 3 中是 JSONSerialization 和 Any,代码部分倒是正确的 然后往后的代码中的 as? 这些 casting 改成更加 Swift 化的 [String: Any] 和 [Any] 会不会更好一点?

p213 连接部分 “不妨看看 Objc 中国上的【部分文章】” 拓展连接已经失效了

onevcat commented 8 years ago

p63

重载~= 的部分【StringLiteralConvertible 】 应该是 swift 3 的 ExpressibleByStringLiteral

已修正


p70 “希望你还记得我们在【对象类型】中所提到的” 对象类型是下文内容,这个表述有一定问题

已经修正了..还没有release新版本


p92 函数部分 第二段代码部分【CollectType】以及 【map】 还是 swift 2 的版本,以及 map 函数应该是在 Sequence 中的

发布的时候 CollectionType 还没改名。现在已经都换成 Collection 了。Array 所使用的 map 是在 Collection 扩展中定义的。Sequence 中虽然也有 map,但是实际上因为 Sequence 可能是无限的,也可能无法多次 loop,所以几乎没有使用场景。


p142 中注释部分 “这不是 Swift 的方法,而是本书在【延时调用】一节中实现的一个方法” delay 是前文已经使用 GCD 实现的一个方法,这样写是不是有些不太妥当?

可能表意不太明确,改为“这不是 Swift 标准库中的方法”会不会好一些。


p182 中的注释部分 “如果您对参数的默认值的 default 感兴趣的话,可以看看【默认参数】一节的内容,有简单的介绍” 也是表述的问题,默认参数一节已经在 59页 讲过,当然这样说也没有错

这个应该还好。因为写这本书的时候并没有说确定章节顺序 (其实在第二版的时候也大幅调整了前后关系),所以说会有一些交叉链接表述上有不妥...


p198 JSON 部分 “举个例子,我们使用 【NSJSONSerialization】 解析完一个 JSON 字符串后,得到的是 【AnyObject】” Swift 3 中是 JSONSerialization 和 Any,代码部分倒是正确的 然后往后的代码中的 as? 这些 casting 改成更加 Swift 化的 [String: Any] 和 [Any] 会不会更好一点?

使用 Any 是正确的,已经修正。


p213 连接部分 “不妨看看 Objc 中国上的【部分文章】” 拓展连接已经失效了

已修正:https://objccn.io/issue-15-0/

FrainL commented 8 years ago

表述的部分其实问题都不大,只是当中的“前文”一类表述稍显不妥,也许直接把当中与章节顺序有关的部分去掉,统一一些会更好。 关于 map 的部分,不知道我理解的对不对: Array 在 Collection 中实现 map 是因为 Collection 本身就是 Sequence,可以看 Collection 中的定义: public protocol Collection : Indexable, Sequence { } 按 command 点进 map 函数是会到 Sequence 中的。 所以严格的说 map 函数是在 Sequence protocol 中的,自定义的类实现了 Sequence 就能自动获得 map 的默认实现。

onevcat commented 8 years ago

Collection 重新实现了 map,可以看看 swift 的源码。https://github.com/apple/swift/blob/master/stdlib/public/core/Collection.swift#L1265-L1286

onevcat commented 8 years ago

相比与 Sequence 的实现,因为 collection 有 non-destructive 和 finite 的保证,要比 Sequence 好一些。其实就像我上面说的,对 Sequence 做 map 并不是一件安全的事情,因为你不能保证 Sequence 在 map 以后原来的 Sequence 还在,而且对于无限的 Sequence 来说 map 直接会尝试获取全部值,而不是以 lazy 的方式使用,这是很致命的,所以其实我个人认为将 map 作为 Sequence 的 extension 不是很明智,至少现在的实现不是是很明智。如果要对一个 Sequence 做 map 的话一定需要慎之又慎。

FrainL commented 8 years ago

班门弄斧了,感谢猫大详细的说明! 这一点我想也是可以写进 Swifter Tips 里面的。 至少我是又学到了。