首页   注册   登录

XDDD

V2EX 第 101301 号会员,加入于 2015-02-28 19:46:16 +08:00
XDDD 最近回复了
都是 Swift 干嘛不上 SPM
看起来 CombineX 的设计(包括 CombineX.Foundation 和 CombineX.Compatible )比 OpenCombine 还要好些。不过可能由于宣传等问题,关注度低于 OpenCombine。这是一个很现实的问题,可能会直接影响到二者的选择( OpenCombine 能得到更多来自社区的资源,目前已经有两个 pr 了。高 star 也会激励作者持续贡献,避免弃坑)

无论如何感谢作者。已 star,期待使用正式版。
@finab \()就是插值。The Swift Programming Language 中将其称为 String Interpolation。
@finab 做了结果相同的两件事,和通过两种方法做一件事是不同的。

想象一下,Swift 本可以让 Any 遵循 CustomStringConvertible,并提供默认实现,你可以 override 这个实现。这样就可以对任意值执行 v.description。而现在,为什么只有 T: CustomStringConvertible 才能调用 T.description,而 Any 只能使用 String(describing: v)?因为从后一种到前一种,语意丢失了。你不知道某个类 T 是否声明自己有字符串表现形式。

T.description:T 声明自己有字符串表现形式。结果的提供者是 T。
String(describing: Any):String 声明自己可以解释 Any。结果的提供者是 String。
"\(Any)":将 Any 插值。结果是 String,所以 String 提供了解决方案。(注意,这里的 String 是类型推导出来的。这一表达式不一定得到 String。如果别的类型实现了 ExpressibleByStringInterpolation,它也可以提供解决方案)

上述三种表达完全独立。这里的结果相同是实现上的一种选择。Swift 当初甚至可以选择让这三种表达得到不同的结果。
@finab 所以我说语义而不是实现啊,如果一个值没有字符串形式(未实现 CustomStringConvertible ),会怎么样?你只能得到一个描述,而不是这个值声明自己有字符串的表示形式。

至于你觉得插值是糖,我直接抄 SE-0228 的代码了:
"The price is $\(cost, format: "%.2f")"
"\([.link: supportURL])Click here\([.link: nil]) to visit our support site"
你觉得它的语义是什么?
@finab

obj.description: 你想要获取某个值的字符串形式。
String(describing:obj): 你想要得到某个值的字符串描述。
"\(obj)": 你想要在 String 中插值。

插值是另一个概念,功能远比你看上去强大。你可以看看 SE-0228。了解一下目前 Swift 是怎么插值的。
更正 #106:解决方案 2 是将 String 转换为 Character 数组。一次性支付 O(n) 的转换开销,以后可以在保证 Unicode 安全的前提下用整数类型以 O(1) 时间复杂度进行索引。

很多人在其它语言上的经验是使用 2 或 3,隐式付出了编码转换或 Unicode 安全的代价。而在 Swift 中,你需要显式支付这一开销。
再说说被误解的最多的,String 的设计。其实很多人没有意识到,字符串及其索引的设计是一个不可能三角。以下三条在逻辑上互斥,不可能同时达到:
1. Unicode 安全(变长编码,字符组合)
2. 性能安全(以 O(1) 时间复杂度进行索引)
3. 类型安全(使用整数类型进行索引,而非 opaque 类型)

而 Swift 实现了以上三条的全部功能,怎么做到的:
1. 如果你需要以 O(1) 时间复杂度进行索引,请使用 String.Index。(抛弃了类型安全,需要用 opaque 类型来索引)
2. 如果你需要用整数类型进行索引,请手动移动下标。(不建议。抛弃了性能安全,需要 O(n) 时间复杂度)
3. 如果你需要用整数类型以 O(1) 时间复杂度进行索引,请使用 String.UTF8/16/32View。(抛弃了 Unicode 安全,直接操作码元)
其实这是很正常的逻辑,哪个语言抛了 Exception,就要用那个语言来处理。如果 Objective-C++ 抛出了 C++ 的 std::exception,用 Objective-C 的 @try 是拿不到的,需要用 C++ 的 try (同样,try 也拿不到 NSException )。

可能是 Swift 对 Objective-C 的兼容做的太好了,让很多人混淆了这两种完全不同的错误 /异常机制。
@xiangyuecn: @fvckDaybyte2 说的是异步错误( Error ),所以在回调中处理。

再重复一遍,Swift 没有 Exception,也不能处理 Exception。如果因为使用 Objective-C 而引入 Exception,需要在 Objective-C 中处理干净。
关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1619 人在线   最高记录 5043   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.3 · 9ms · UTC 16:51 · PVG 00:51 · LAX 08:51 · JFK 11:51
♥ Do have faith in what you're doing.