Questions tagged «swift-language»

Swift是Apple设计的用于创建iOS和OS X应用程序的编程语言。Swift建立在C和Objective-C的基础上。

5
在这些比较中,Swift如何比Objective-C快得多?
苹果在WWDC14上发布了其新的编程语言Swift。在演示中,他们对Objective-C和Python进行了一些性能比较。以下是其中一张幻灯片的图片,比较了执行某种复杂对象排序的这三种语言: 关于使用RC4加密算法的性能比较,还有一个更加令人难以置信的图表。 显然,这是一次市场营销讲座,他们没有详细介绍如何在每种情况下实施。我让我想知道: 一种新的编程语言怎么能这么快? Objective-C的结果是由错误的编译器引起的还是在客观上比Swift效率低? 您如何解释性能提高40%?我知道垃圾回收/自动引用控制可能会产生一些额外的开销,但是要多少呢?

10
程序为什么要使用闭包?
在阅读了许多解释闭包的文章之后,我仍然缺少一个关键概念:为什么要写闭包? 程序员将执行什么样的特定任务,最好通过闭包来完成? Swift中闭包的示例是访问NSUrl并使用反向地址解析器。这是一个这样的例子。不幸的是,这些课程只是关闭。他们没有解释为什么将代码解决方案写为闭包。 一个现实世界中编程问题的示例可能会触发我的大脑说:“啊哈,我应该为此写一个闭包”,这比理论上的讨论要有用得多。该站点上不乏理论讨论。

1
Swift协议命名约定
来自主要是C#的背景,我习惯于使用术语“接口”来描述对象,而该对象没有定义行为的实现。在c#中,惯例是在接口名称前加上“ I”,如IEnumerable等等。 当然,该概念在不同的语言中具有不同的名称。在Swift中,相同的概念称为“协议”。在开发协议时,我经常为协议和实现它的类有非常相似的名称。到目前为止,我一直在将“ protocol”一词附加到这些对象上,就像在c#中使用“ I”一样,在EnumerableProtocol等等中。 对快速命名协议的约定有何想法?

8
为什么要设计一种没有异常处理机制的现代语言?
许多现代语言提供了丰富的异常处理功能,但是Apple的Swift编程语言没有提供异常处理机制。 像我一样,我陷入了异常,无法理解这意味着什么。Swift有断言,当然还有返回值。但是我很难想象我基于异常的思维方式如何映射到一个没有例外的世界(就此而言,为什么这样的世界是可取的)。有像Swift这样的语言我无法做的事情我可以做例外吗?通过丢掉异常我能获得一些收益吗? 例如,我如何最好地表达这样的话 try: operation_that_can_throw_ioerror() except IOError: handle_the_exception_somehow() else: # we don't want to catch the IOError if it's raised another_operation_that_can_throw_ioerror() finally: something_we_always_need_to_do() 缺少异常处理的语言(例如,Swift)?

2
现代语言是否仍使用解析器生成器?
我是研究关于gcc编译器套件在维基百科这里,当这想出了: GCC开始使用由Bison生成的LALR解析器,但后来逐渐切换为手写递归下降解析器。2004年用于C ++,2006年用于C和Objective-C。目前,所有前端都使用手写递归下降解析器 因此,在最后一句话中,(以及我所信任的维基百科),我可以肯定地说:“ C(gcc),C ++(g ++),Objective-C,Objective-C ++,Fortran(gfortran),Java(gcj), Ada(GNAT),Go(gccgo),Pascal(gpc),... Mercury,Modula-2,Modula-3,PL / I,D(gdc)和VHDL(ghdl)”都是前端,不再使用解析器生成器。也就是说,它们都使用手写的解析器。 我的问题是,这种做法无处不在吗?具体来说,我在[Python,Swift,Ruby,Java,Scala,ML,Haskell]中寻找x的“ x的标准/官方实现是否具有手写的解析器”的确切答案?(实际上,这里也欢迎提供其他语言的信息。)我敢肯定,经过大量的挖掘,我可以自己找到它。但是,我也相信社区很容易对此负责。谢谢!

6
Swift函数与计算属性
假设我有一个Event如下课程: class Event { private var attendees: [Person] = [] // Case 1 //******* // Should I use a func… func countOfAttendees() -> Int { return attendees.count } // …or a var var countOfAttendees: Int { return attendees.count } // Case 2 //******* // Should I use a func… func …

3
在单元测试中挣扎于循环依赖
我正在尝试通过使用TDD开发类似于Bit Vector的简单方法来练习TDD。我碰巧正在使用Swift,但这是一个与语言无关的问题。 My BitVector是一个struct存储单个的UInt64,并在其上方提供一个API,可让您将其视为集合。细节无关紧要,但是很简单。高57位是存储位,低6位是“计数”位,它告诉您实际上有多少个存储位存储一个包含的值。 到目前为止,我有一些非常简单的功能: 构造空位向量的初始化程序 count类型的属性Int isEmpty类型的属性Bool 等于运算符(==)。注意:这是类似于Object.equals()Java 的值相等运算符,而不是像==Java中的引用相等运算符。 我遇到了一堆周期性依赖关系: 测试我的初始化程序的单元测试需要验证新构造的BitVector。它可以通过以下三种方式之一进行操作: 校验 bv.count == 0 校验 bv.isEmpty == true 检查一下 bv == knownEmptyBitVector 方法1依赖count,方法2依赖isEmpty(它本身依赖count,因此没有用处),方法3依赖==。无论如何,我不能孤立地测试初始化​​程序。 测试是否count需要对某些东西进行操作,这不可避免地会测试我的初始值设定项 实施isEmpty依赖count 执行==依赖count。 我能够通过引入一个私有API来部分解决此问题,该API BitVector从现有的位模式(作为UInt64)构造一个。这使我可以在不测试任何其他初始化程序的情况下初始化值,以便可以向上“引导”。 为了使我的单元测试真正成为单元测试,我发现自己做了很多黑客操作,这使我的产品和测试代码大大复杂化。 您如何解决这些问题?

2
为什么Swift不需要分号?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 4年前关闭。 我通常使用c#或Objective-C进行编码,最近我开始学习Apple的新编程语言-Swift。 我注意到的第一件事是,您不需要在Swift中添加分号来结束一行,但是如果您这样做了-至少从我的测试中可以看出,它不会干扰编译器。 当我写: int someNumber = 0; 在Objective-C中,分号告诉程序该行结束并且不会掉线到下一行。 使用Swift我可以用 var someNumber:Int = 5 而不添加分号,系统便知道这是行的结尾。 是什么让某些语言可以这样做而其他语言则不能呢?为什么不保持统一的系统,在末尾添加分号?

3
由于什么原因,您会为Swift中的每个委托使用单独的类扩展?
我正在阅读Ray Wenderlich教程,并且注意到作者使用类扩展来保存委托回调,而不是让它们在类本身中进行处理,即: 类扩展内的委托回调: extension LogsViewController : UIPopoverPresentationControllerDelegate { func adaptivePresentationStyleForPresentationController(controller: UIPresentationController, traitCollection: UITraitCollection) -> UIModalPresentationStyle { ... } } 而不是将其包含在类中: 在类内委托回调: class LogsViewController : UITableViewController, UIPopoverPresentationControllerDelegate { func adaptivePresentationStyleForPresentationController(controller: UIPresentationController, traitCollection: UITraitCollection) -> UIModalPresentationStyle { ... } } 我同时发现这很奇怪也很有趣。他有一个专门用于LogsViewController类的扩展的文件,名为“ LogsViewControllerExtension.swift”,并且每个委托协议都有一个不同的扩展名:UITableViewDataSource,UISplitViewDelegate等,即: 多个类扩展,每个都有自己的文件中的委托回调: extension LogsViewController: UISplitViewControllerDelegate { ... callbacks } extension LogsViewController …

3
将一组相关的属性包装到其自己的struct / class中是一种好习惯吗?
用Swift编写User对象,尽管我的问题与任何强类型语言有关。用户可以拥有一堆链接(FacebookProfile,InstagramProfile等)。有关此问题。 将链接包装在其自己的对象中是一种好习惯吗? struct用户{ var firstName:字符串 var lastName:字符串 var email:string var链接:链接 } 结构链接{ var facebook:字符串 var instagram:字串 var twitter:字符串 } 还是应该松散?从技术上讲,我知道这两种方法都很好,但是总体上想知道是否有推荐的方法,尤其是为了提高可读性。 struct User { var firstName: string var lastName: string var email: string var facebookLink: string var twitterLink: string var instagramLink: string } 在这种情况下,链接应该是集合/列表吗?我认为它不应该是一个列表,因为有固定数量的链接选项可用,并且数量不会增加。我的想法对吗? 将我的网络方法放置在User对象(例如getUsers,getUser,updateUser)内是否是一种好习惯? 我知道这些可能是主观的,但是我试图了解在类似情况下的最佳实践是什么。将不胜感激任何指针。

1
Swift为什么需要见证表?
我正在尝试阅读Swift的实现细节,我无法确定的一件事是它的“见证表”。看起来它们是用于结构的单独vtable指针。 但是你为什么需要那个呢?结构是按值复制的,因此在编译时您已经知道它们是什么类型。那么,您是否不只是硬编码要调用的方法并完成该方法呢?为什么要对这些方法执行虚拟调度?

3
为什么Swift首先要初始化子类的适当字段?
在Swift语言中,要初始化一个实例,必须填写该类的所有字段,然后才调用superconstructor: class Base { var name: String init(name: String) { self.name = name } } class Derived: Base { var number: Int init(name: String, number: Int) { // won't compile if interchange lines self.number = number super.init(name) } } 在我看来,这是倒退的,因为需要self在将实例赋值给其字段之前创建实例,并且该代码给人的印象是好像链接仅在赋值之后发生。除此之外,超类没有合法的手段来读取其子类的引入属性,因此在这种情况下安全性不算在内。 另外,许多其他语言(例如JavaScript),甚至是Objective C(在Swift上都是精神上的祖先),都需要在访问之前self而不是之后进行链接调用。 在调用超构造函数之前要求定义字段的选择背后的原因是什么?
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.