关于 Swift,我不喜欢的几点
在以前,我已经写过很多喜欢 Swift 的理由。但是今天,我想要写的是这门语言不足的地方。这是一个锱铢必较的问题,所以我将举例描述,去指出这门语言做的好的地方,做的不好的地方,以及其前景。 语言内定义 VS 非语言内定义看一下
class Person attr_accessor :first_name,:last_name end 乍一看,它像是一种语言特性,与 def self.attr_accessor(*names) names.each do |name| define_method(name) {instance_variable_get("@#{name}")} # 这是 getter 方法 define_method("#{name}=") {|arg| instance_variable_set("@#{name}",arg)} # This is the setter end end 如果你不能读懂 这是我爱上 可选类型Swift 的一个核心特性就是它的可选类型。它允许用户定义某个变量是否可以为空。在系统中,被定义为枚举的格式: enum Optional<WrappedType> { case Some(WrappedType) case None } 就像 enum RemoteLoading<WrappedType> { case Loaded(WrappedType) case Pending } 它和 然而,在某种程度上, let name: Optional<String> = .None let name: Optional<String> = nil let name: String? = nil var name: String? 让我们解析下它们的含义。第一条语句是完整的表述(带有类型推断)。你可以使用相同的语法声明你自己的 第三条和第四条语句,编译器开始使用 后面的两条语句不支持自定义类型。语言的 Optional 类型,可以通过语言内存在的结构定义,以特定类型的异常结束,这个异常只有当前类型可以访问。 家族
虽然 if 语句和 while 循环是通过 BooleanType 类型 在 Swift 2.2 中这样子工作的 ,但是这种功能在 Swift 3 已经被移除了。我不能像在 for..in 循环语句中那样子定义自己的布尔类型值然后在 if 语句中使用。 这里有两种基本的方法去定义语言特性,在 Swift 中都有体现到。第一种是创建一个可以用来定义语言特性的元工具;另一种是定义语言特性和语言类型值之间的一种明确和具体的关系。 你可以会对符合 SequenceType 的类型值比符合 BooleanType 的类型值更加有用这个观点提出异议。但是,Swift 3 已经完全的移除了这个特性,所以,你只能承认:你不得不去认为 BooleanType 是如此没有用处以至于会被完全禁止。 运算符在 Swift 中的运算符也值得研究。语言中存在着定义运算符的语法,所有的算术运算符都是在这个语法中被定义的。用户们可以自由的定义自己的运算符,如果你想要创建自己的 BigInt 类型,同时也想要使用标准的算术运算符,这将是非常有用的。 然而 在这三个情况中,我都比较了两个东西:一是被标准库用来实现特性的有用语法,一种是特权标准库超越使用者代码的特殊情况。 最好的语法和语法糖是可以被一门语言的作者利用自己的类型和系统不断深入挖掘的。Swift 有时使用 我认为另一个值得注意的点是,即使我爱 Ruby 的语法,但是 Ruby 在运算符和 错误在某种程度上来说,Swift 的可选类型类似于 C 语言的可控性, Swift 的错误处理也类似于 C 语言的异常处理。Swift 的错误处理引入了一些新的关键词: 使用 func doThing(with: Property) throws -> Value 重写为 func doThing(withProperty) -> _Result<Value,ErrorType> 事实上,这种 _Result 类型并没有被显式定义,而是 在编译器中被隐式的处理了 )。这对于我们的例子并没有造成太多的不同。)在调用函数的内部,传入成功的值的时候将会通过 try 语句,而发生错误的时候,则会跳入并执行 对比这个和之前的例子,例子中语言特性被定义在语言内部,再加上语法(例如操作符和 SequenceType)和语法糖(例如 Optional),那么这个代码就变的像我们所期待的那样了。相反的,Swift 的错误处理并没有暴露它的内部 _Result 模型,所以用户无法使用或者改变它。 一些情况下使用 Swift 模型来进行错误处理非常合适,例如 Brad Larson 用来移动机器人手臂的代码和 我的 JSON 解析代码 。其他情况的话,使用 Result 类型和 flatMap 会更合适。 其他的代码可能依赖异步处理,并想要传递一个 Result 的类型值给 未来Swift 4 承诺在不久后,将使用异步的语言特性。目前还不清楚将如何实现这些功能,但是 Chris Lattner 已经写了很多关于 Swift 4的东西
Swift 的异步的处理机制将会是什么样子的,异步/等待 是我的主要理论。在外行人看来,异步/等待 声明什么时候函数是异步的 async Task<int> GetIntAsync() { return new Task<int>(() => { Thread.Sleep(10000); return 1 }); } async Task MyMethodAsync() { int result = await GetIntAsync(); Console.WriteLine(result); } 第一个函数方法, 从这个例子看来, 它也像错误处理模型一样有着缺陷。在加上新构造和一些关键词之后,更像是语法糖,而不是一个有用的工具。这种构造一部分依赖于在标准库中定义的类型,一部分依赖于编译器定义的语法。 属性属性行为是 Swift 4 可能引入的另一个重大特性。这里是关于属性行为的拒绝提案,在 Swift 4中,这一个特性被更密切的关注。 属性行为让你可以对一个属性附加上行为,比如添加 lazy。这个 lazy 属性,举个例子,只有它在被第一次访问时才设置值。但你现在已经可以使用这个特定的行为,这是直接硬编码进 Swift 编译器的。属性行为将使标准库更容易地实现一些行为,同时方便用户去完全自定义行为。 可能这已经是全世界最好的特性了。从一个已经被硬编码进编译器的一个特性开始,然后在这个特性取得一定声望之后,创建一个更通用的框架来允许你通过语言本身定义这个特性。基于这一点,,任何 Swift 的开发者都可以实现类似的功能,精确调整来满足自己的需求。 如果 Swift 的错误模型遵循着相同的路径,Swift 的标准库可能会暴露出一个 Result 类型值,然后任何返回 Result 值的函数,都可以在必要的时候,使用 异步/等待可以按照同样的方式。定义一个 元编程我想要更多地去写一些关于元编程的知识。我已经写了关于 Objective-C 中的元编程,它和我们正在着手做的事情很相似。代码和元代码之间的界限是模糊的。Swift 编译器中的代码是元代码,并且 Swift 本身也是代码。如果定义一个 作为一种面向协议的语言,Swift 很独特,可以让我们挖掘这门语言的语法魅力,就像我们用 关键词停止和语法开始或者语法停止和语法糖开始的界限,不是很明确,但是对于使用这门语言编写代码的工程师,应该有能力去使用那些开发标准库的工具。
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- Binary XML file line #8: Error inflating clas
- ruby可以一次运行的线程数量有限吗?
- XML解析之二—— Dom4j、JAXP、JDom(含XPath)
- 利用正则表达式实现去除所有HTML标签代码
- ruby-on-rails – Ember-rails项目作为可安装的引
- 春光三月好读书:Oracle性能优化 及 RWP北京站
- JQuery.getJSON 从aspx页面返回JSON数据
- react实现img的onerror
- React 的数据载体:state、props、context
- ruby-on-rails – rails db:migrate vs rake db