我们期待的 Swift 3.0 将会是什么样?

我们期待的 Swift 3.0 将会是什么样? —— 此调查来自官方的 Swift 社区

随着诸如协议扩展、错误处理等 Swift 2.0 新引入的强大特性发布,这都意味着苹果已经明确表示,它们非常积极地听取来自开发者社区的意见来帮助完善和改进这门语言。我们调查了几位使用 Swift 的开发者朋友,询问他们对下一个版本的 Swift 有何希冀,因此他们将在类型系统、协议以及工具等方面和我们一起分享他们的想法。

Sash Zats

Labgoo、Wondermall 的 iOS 工程师、用户体验设计师及 API 架构师

类型化的错误

我第一个期望就是类型化的错误(typed error),虽然这个想法还很不成熟,但是却能给错误处理带来极大地改善。Swift 2 引入了新的错误处理机制,但是遗憾的是,和语言中其他结构不同,错误结构并不是类型安全的。这样做的好处就是错误处理成为了函数签名(function signature)的一部分,比如说 do something() 和 do something() throws 的类型并不相同,前者无法代替后者来使用;坏处就是 dosomething() throws 无法指明它能够抛出的错误类型(就像协议列表一样:throws)。

依赖类型

我的第二个期望是提供“依赖类型”(dependent type)的支持。这个想法同样仍未完全在我的脑海中成型,不过我确信它将给现有的类型系统中带来全新的绝妙体验!它将给值类型本身加入限制,类型系统的解析方式为:未定类型的数组 -> 字符串数组 -> 只含有2个元素的字符串数组。这对现有语言来说是一个极其有用的补充。下面的例子阐述了这个功能在什么地方比较有用:

class Car {
  var wheels: [Wheel]<4> = [Wheel(), Wheel()]
  // 编译错误,类型不匹配,需要 4 个Wheel 类型
}

Cocoa 的 Swift 分支

最后,我希望看到(不过很可能不会实现)Cocoa 的 Swift 分支版本。虽然 Cocoa 是一个很棒的框架集合,但是它自身携带的内容实在过于庞大,有可能会影响到 Swift 的开发方式。

我很想看到无需进行引用的结构体能够普遍应用到新的分支上来(在我的想象中,我认为诸如 UIBarButtonItem、UINavigationItem 之类的类应该不需要让你来累积它们的状态,因此它们可以被替换为结构体)。因此,我们就可以重新设计 API,尽可能地使用枚举中关联值的优势。在某些情况下,枚举能够更精确地描述其作用:例如 UIDatePicker 可以在一个属性中使用关联枚举,来同时表示其日期值和创建值所使用的模式。

class UIDatePicker {
  enum Value {
    case Date(date: NSDate)
    case CountDownTimer(period: NSTimeInterval)
  }
  var value: Value?
}

虽然这不大可能会发生,因为这种变化需要一个独立的团队为现有和新的 API 建立一个全新的版本,这个过程中需要耗费极大的努力。

我知道,我的这些想法和 Swift 团队正面临的实际问题和长期目标而言是非常的幼稚的,因为整个社区都知道他们所做的一切棒极了!

Jorge Ortiz

PoWWaU 创始人,移动开发开发者及教师

更好的辅助工具

我希望有一套比较成熟的辅助工具。比如说,我希望有一个我可以永远信赖的调试器,而不是时不时出错的玩意儿。这个调试器能够在当前的堆栈帧显示某个 符号的实际值。此外,我还希望有一个能够对 Swift 进行重构的编辑器,就像在 Objective-C 中所做的那样,这样我就可以在它的帮助下改善我的代码,比如说将一些语句提取到方法中,或者重命名项目中某个类或方法的名称。

这个编辑器需要能够生成代码,将我从代码套路中拯救出来(我的意思不是指代码片段)。例如,如果编译器发现我的类或者结构没有完全实现某个协议,那么我希望有一个选项能够让编辑器自动将定义中所缺少的方法创建出来。

完善的测试

第二个愿望非常简单,但是却能够让进行测试的人们感到由衷的高兴。我希望运行测试时无需使用模拟器,这样能够提升使用体验。如果某个类只基于 Foundation,那么对其的测试应该可以无需模拟器就可以进行。这将减少需要运行的测试套件,使测试花费的时间更短。

内省机制

第三个愿望就涉及到语言本身了。我希望 Swift 拥有更好的内省(Introspection)能力,如果你愿意的话也可以称之为反射(reflection)。此外,还希望其拥有更加动态化的调度机 制。没有了这些特性,诸如 Mocking 框架之类的工具将无法被创建出来。

Sam Giddins

UChicago 2018. CocoaPods. Bundler.

高阶泛型类型

首先我需要向大家道个歉,因为你可能会很反感我们这些骄傲的开发者需要向 Swift 团队乞求我们所希望的 Swift 3 新特性。不过我觉得实现这个特性是最为重要的,因此无论怎样我都在所不辞。

由于高阶泛型类型(High-Kinded Type)是一个难以理解的东西,因此我打算用我们最喜欢的函数式编程比喻——卷饼,来为大家解释。我们知道,我们可以用同样的方式吃各种各样的卷饼,无 论里面的内容如何,因为卷饼本身只是内部填充物的一个包装而已。但是,如果我们有这样一个方法告诉 Swift,“这里是一个对象,我唯一关心的事情只是它是一个卷饼,无论里面卷了牛排还是蔬菜还是虾,我都只关心它是一个卷饼。”然而 Swift 并不能让你轻易做到,如果你要吃某个卷饼的话,你首先需要这么做:“拥有相同填充物的卷饼是相同的”。这样的话,你会发现你能使用的卷饼为数甚少……

我们勉为其难地说目前 Swift 的上层结构类型并不能让我们这样表示。并没有任何办法写出关于 Monad 或者 Functor 的定义,这些定义可以用在该类型的所有实例当中,举个例子,这意味着我们所添加的每个全新的 SequenceType,都必须表示为 S: Equatable when S.Element: Equatable 的形式。这让代码重复量十分可怕,这意味着我们不能将我们的真实目的编码到类型系统中,导致我们程序员有更多犯错和制造 bug 的情况发生。

Jacob Schwartz

Glint 首席工程师

取消 Xcode 和 Swift 版本的关联

我很高兴能够看到 Swift 语言演变至今,我认为它的团队正在做一个十分了不起的工作,并且他们能预测到我们的需要,并且对大众反馈做出反应。

对于 Swift 3.0 来说,我很希望能够从不同版本的 Xcode 中使用这门语言。我并没能够完全深入地研究 Swift 2.0,因为它只能够在 Xcode 7上面使用,而 Xcode 7 取消了支持 iOS7 。将 Xcode(以及 iOS SDK)和 Swift 版本关联起来会造成不必要的惰性,阻碍开发者们迁移到新的语法当中。

所以不要让我们难以取舍,让我们在任何时候都能够用上最新的语言!

Viktor Belenyesi

Prezi 首席 iOS/Mac 开发者

扩展中的存储属性

就像 Scala 的特性一样,如果我们能够给既有类中通过扩展添加新的存储属性的话,这将会是巨大的改进。我们可以用 ObjC 运行时来实现此功能,但是这种代码给我的感觉很不好,因为我每次都必须输入这样的鬼东西:

extension UIView {
  var myTag: String? {
    get {
      return objc_getAssociatedObject(self, "myTag") as? String
    }
    set(newValue) {
      objc_setAssociatedObject(self, "myTag", newValue, UInt(OBJC_ASSOCIATION_RETAIN))
    }
  }
}

Agnes Vasarhelyi

Prezi iOS/Mac 开发者

自定义泛型类型中的协变机制

Swift 中内置的类型已经是协变(covariant)的了,但是当涉及到自己创建的 Party 的时候,一般情况下就必须要给来宾名单中加入不同的人,不然的话这个设计就是失败的。

Sam Ritchie

CodeSplice首席Codesplicer

约束泛型的协议一致性

Swift 扩展有两个非常有用的功能,一个是能够增加协议的一致性(protocol conformance),比如说在 Swift 1 中:

extension String: JSONEncodable {
  func toJSON() -> JSON { return .String(self)
   }}

另一个就是能够给协议增加泛型约束(generic constraints),比如说在 Swift 2 中:

extension Array where Element: JSONEncodable {
  func toJSON() -> JSON {
    return .Array(self.map { $0.toJSON() })
  }
}

很遗憾的是,你不能将这两者结合起来(即给约束泛型类型添加协议一致性),比如说:extension Array: JSONEncodable where Element: JSONEncodable 这种写法是无法通过编译的。这意味着如果你在尝试使用“面向协议编程”的话,你不仅需要避免使用泛型,还要花费大量的时间和精力来写重载函数。如果这项特性能够在 Swift 3 中实现的话,那么我相信它能拯救很多代码,让协议以及泛型更加有用。

Tony Arnold

Itty Bitty Apps 以及 The CocoaBots 的首席开发者

我对语言本身其实没有太大的期望,不过如果能有类似 C# 之类的语言的异步风格函数(Async-Style Function)的话,那就再好不过了。不过我最想看到的还是更好的辅助工具。在 Xcode 中使用 Swift 仍然是一件很痛苦的事情,比如说我无法使用重构,这让我感觉好像在使用几十年前的 IDE一般。如果能有更好的工具,并且有更清晰的错误提示的话,那无疑再好不过了。

同样我希望在明确需要使用 Optional.None 的地方让nil被禁用掉,不过这听起来像是我喝多了才会提出这个建议的。

说句实话,我并没有实实在在地思考过 Swift 3.0 的模样。标准库就已经很好很简洁了,如果它缺少什么东西的话,你实际上可以自己搭建出来。

Benji Encz

Make School 工程师,即将入职 PlanGrid

类型化的错误处理

我最想看到的就是函数可以抛出他们能够产生的错误类型。目前苹果的建议是在函数的文档中写出这些错误类型,但是如果编译器也知晓这些错误类型的话那是不是 更好一些呢?这样就可以实现一个精确的错误处理,而不是使用一个 catch-all 的错误捕获。这同样可以让 API 中可产生错误的函数能更好地表述自己。

那么,你期望中的 Swift 3.0 是什么样子的呢?

文章转载自 开源中国社区[https://www.oschina.net]

时间: 2024-10-16 22:19:42

我们期待的 Swift 3.0 将会是什么样?的相关文章

Swift 2.0初探: 值得注意的新特性

转眼间,Swift已经一岁多了,这门新鲜.语法时尚.类型安全.执行速度更快的语言已经渐渐的深入广大开发者的心.我同样也是非常喜爱这门新的编程语言. 今年6月,一年一度的WWDC大会如期而至,在大会上Apple发布了Swift 2.0,引入了很多新的特性,以帮助开发者能更快,更简单的构建应用.我在这里也说道说道Swift 2.0中值得大家注意的新特性. guard语句 guard语句和if语句有点类似,都是根据其关键字之后的表达式的布尔值决定下一步执行什么.但与if语句不同的是,guard语句只会

抢先看 Swift 3.0

本文讲的是抢先看 Swift 3.0, 这篇文章介绍了 Swift 3.0 的目标.发布进程和预计的时间表. Swift 3.0 是一个不兼容 Swift 2.2 语法的大版本更新.它对语法和基本库有着根本性的改变.Swift 3.0 实现的完整修改列表可以在 Swift evolution site 中查看. Swift 3.0 是首个包含 Swift Package Manager 的发布版本.现在 Swift Package Manager 还处于早期开发版本,它支持开发和发布跨平台的 S

Swift 3.0在集合类数据结构上的一些新变化总结_python

一.Array数组的更改 array数组中修改的API示例如下: //创建大量相同元素的数组 //创建有10个String类型元素的数组,并且每个元素都为字符串"Hello" //swift2.2 //var array3 = [String](count: 10, repeatedValue: "Hello") //swift3.0 var array3 = [String](repeating: "Hello", count: 10) //创

《从零开始学Swift》学习笔记(Day 3)——Swift 2.0之后增加的关键字

 Swift 2.0学习笔记(Day 3)--Swift 2.0之后增加的关键字   原创文章,欢迎转载.转载请注明:关东升的博客  看了之前的学习笔记知道了什么是关键字,现在提示各位在Swift 2.0之后增加defer.guard.repeat.catch.rethrows.hrow.throws和try关键字,其中repeat关键字替代do - while循环中的do,即中repeat - while循环.而do关键字用于错误处理.catch.rethrows.throw.throws

Swift 3.0 新增安全特性的一点普及

本文讲的是Swift 3.0 新增安全特性的一点普及, 在 Swift 发布之后,Swift 的开发者一直在强调,安全性与可选择类型是 Swift 最为重要的特性之一.他们提供了一种nil的表示机制,并要求有一个明确的语法在可能为nil的实例上使用. 可选择类型主要以下两种: Optional ImplicitlyUnwrappedOptional 第一种做法是一种安全的做法:它要求我们去拆解可选类型变量是为了访问基础值.第二种做法是一种不安全的做法:我们可在不拆解可选择类型变量的情况下直接访问

《从零开始学Swift》学习笔记(Day 7)——Swift 2.0中的print函数几种重载形式

 原创文章,欢迎转载.转载请注明:关东升的博客   Swift 2.0中的print函数有4种重载形式: print(_:).输出变量或常量到控制台,并且换行. print(_:_:).输出变量或常量到指定类型的流中,并且换行. print(_:appendNewline:).输出变量或常量到控制台,appendNewline参数是布尔值,true表示换行,false表示不换行. print(_:_:appendNewline:) .输出变量或常量指定类型的流中,appendNewline参

v聊聊 Swift 3.0 - 新版本对我们的影响

聊聊 Swift 3.0 - 新版本对我们的影响 Swift 近两年的发展势头非常的迅猛,而在它开源后,更是如井喷一样的势头,除了 iOS 平台,还支持了 Linux. 而今年下半年, Swift 3.0 也会随之发布.这次我就和大家聊一下 Swift 3.0 会有什么新东西吧. Swift 专门为版本更新相关的文档创建了一个 Guihub 主页,地址是 https://github.com/apple/swift-evolution . 这里面列出了 Swift 3.0 版本着重处理的地方,我

《Swift语言》中文版 Swift 2.0 已经完成!

<Swift语言>中文版 Swift 2.0 已经完成!<The Swift Programming Language>简体中文版升级至 Swift 2.0. 1 开源项目完成难,维护更难. 大家看到的是发布时的瞩目和荣耀,却没有看到项目本身质量不高.错误频出.这并不是翻译者和校对者的问题,他们已经付出了足够的努力.真正的问题在我,没有建立起长期的维护团队,因此后期的校对和更新都难以实施. 1.0发布之后,我们就再也没能和苹果的文档同步.语法错误.编译不通过.语言不通顺,阅读量直线

swift 2.0 advance用法

问题描述 swift 2.0 advance用法 let str = "Hello world!" let index = advance(str.startindex, 7)//这个报错 求具体怎么改 解决方案 把advance方法改成advancedBy let str = "Hello world!" //let index = advance(str.startindex, 7) let index = str.startIndex.advancedBy(7