热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Swift编程语言FAQ

作为苹果在WWDC2014上发布的新编程语言,Swift绝对是当前的热门话题。Swift由苹果开发者工具部门总监克里斯·拉特纳(ChrisLattner)耗时四年开发而
作为苹果在WWDC 2014上发布的新编程语言,Swift绝对是当前的热门话题。Swift由苹果开发者工具部门总监克里斯·拉特纳(Chris Lattner)耗时四年开发而成,苹果宣称Swift的特点是:快速、现代、安全、互动,且全面优于Objective-C语言。
 
在Swift发布之后,随之而来的便是各种入门教程,各种上手体验,各种用Swift编写的demo...不管是经验丰富的开发者还是新手开发者都急切地想上手体验下这门汲取了Objective-C、Rust、Haskell、Ruby、Python、C#以及CLU等编程语言精华的新语言。不过,初次接触Swift总会有不少问题,比如刚入行的开发者应该学习Objective-C还是Swift?有没有Swift可以实现,但Objective-C不能实现的事情?以及能否用Swift来调用自己的Objective-C代码或者第三方库等等。下面这篇文章针对这些问题进行了解答。
 
 以下内容编译自 raywenderlich.com
 
(注:本文解答带有主观性,请批判性查阅。任何你的意见/评论请留言, 我们将跟据您的反馈适当地更新FAQ。)
 
基础部分
 
1.我是个刚入行的开发者,我应该学习Objective-C还是Swift,还是两个都学?
这取决于你是计划到其他公司工作,还是作为一个独立iOS开发者。
 
a. 如果你是其他公司的全职iOS开发者或者顾问,你最好两个都学。因为很多公司现有的代码还是用Objective-C写的,你需要理解这些代码。并且一些公司不会立刻过渡到Swift语言开发。此外,你还需要理解使用Objective-C编写的海量iOS库、教程以及示例项目。另外,随着时间的推移,很多公司会逐渐过渡到Swift开发,所以你也需要学习Swift。
 
b. 如果你是独立开发者,你打算从一开始就使用Swift,理论上你只了解Swift就可以了。但如果你有时间,还是应该去了解Objective-C,这样你就可以使用已有的Objective-C强大的资源库。
 
根据市场的变化和Swift渗透率的增长,这个问题的答案也在不断变化。最终,知道Objective-C可能会像知道COBOL一样了。
 
2.我有多年的Objective-C开发经验。对于Swift,我是新手么?
是,但也不是。如果你为苹果平台开发过一段时间,你仍有很大的优势。因为你很熟悉Xcode和Cocoa/Cocoa Touch API。学习Xcode和上千个Cocoa/Cocoa Touch API要比学Swift花的时间更长,所以你有很好的开发基础。长话短说,一旦你熟悉了Swift代码,你就能很快地学习Swift。
 
3.iOS 8和OS X Yosemite的应用程序只使用Swift语言么?
不是。Swift语言能与Objective-C流畅地交互,反之亦然。苹果并没有完全将Objective-C 的API转成Swift,但你仍可以在Swift代码中仍使用这些API。时间会证明一切,但是很多年内iOS和OS X商店在采用Swift语言的同时仍会继续依赖Objective-C语言。
 
4.Swift语言适用于其他版本的iOS和OS X系统么?
是的!Xcode 6可以为iOS 7及以上和OS X10.9及以上的系统版本编译Swift代码。其实,现在你从App Store下载的WWDC app就是苹果用Swift语言编写的。

但是,记住苹果不允许使用Xcode Beta版本创建的应用程序提交到App Store。因此,你需要等到Xcode 6正式版发布才能在App Store中上传Swift编写的应用程序。
 
5.Swift语言是取代Objective-C,还是对其的补充?
引用苹果官方的一句话,“Objective-C不会消失,Swift和Objective-C可同时用于Cocoa和CocoaTouch开发。”因此,你仍然可以继续使用Objective-C。然而,苹果似乎鼓励你使用Swift进行新的开发,而不是希望你重写所有的Objective-C代码。我们猜测苹果在未来的框架和API开发中将会逐渐减少使用Objective-C语言,甚至有一天会弃用Objective-C,所以早作准备吧!
 
6.playground是什么?
playground是一个文件,你可以编写代码的同时即刻看到运行效果。对于学习Swift或者新的API、原型代码或者算法真的很有用处!
 
7)如何学习Swift?
网上已经有很多不错的资源:
苹果的 Swift Programming book
你也可以在Xcode中阅读本书:Help\Documentation and API Reference\New Features in Xcode 6 Beta\Swift Language\The Swift Programming Language\A Swift Tour\Open Playground)
WWDC 2014的Swift视频 
我们的 Swift video tutorial seriesSwift Quick Start tutorial
Swift备忘单和速查手册
 
8.未来你们的书和教程会使用Swift吗?
会的。我们会帮开发者过渡到Swift。
 
进阶

1.有没有Swift可以实现,但Objective-C不能实现的事情?或者反过来说。
是的。Swift是一门现代语言,引入了很多Objective-C不支持的内容。比如命名空间(namspacing)、可选类型(optionals)、元组(tuples)、泛型(generics),类型推断(type inference)以及其他等等。当然,Objective-C也有一些Swift不具备的特性,比如messaging nil.
 
想了解更多细节,建议在读完本文后阅读下苹果的官方文档: Using Swift with Cocoa and Objective-C Guide  (这里有 中文版
 
2.有没有Swift不能用的API?
在写这篇文章时,我还没发现有。但在使用Objective-C和Swift互通方面有些注意事项:
a. 当一个Objective-C的API返回一个id时,Swift将接收到AnyObject。
 
b. 当一个Objective-C API返回nil,Swift将获得一组Optional类型的值,且被设置成NONE,Swift以这种方式来表示一个变量为nil。Swift的变量必须始终包含一个值,因为不能保证Objective-C 方法不会返回nil,所以Swift使用Optional类型枚举来保存任何从Objective-C API返回的对象。
 
c. 当一个Objective-C API返回一个集合时,由于Swift无法判断NSArray或NSDictionary存储了什么类型,所以它会被转换为AnyObject 。基于你对API的了解,向下转换(downcast)你的集合是个很好的习惯。思考一个返回NSString实例的数组的Objective-C方法。由于你已经知道返回的数组里包含了字符串,所以你可以像下边那样安全地进行转换:
 
 
  1. let fruits : AnyObject[] = // some Objective-C API that returns NSArray of NSStrings 
  2.   
  3. for fruit in fruits as String[] { 
  4.     println(fruit) 
d. 当一个Swift API返回一个元组(Tuple),Objective-C将收不到任何值。这是因为Objective-C不支持元组,因此该方法不适用于Objective-C代码。以下是Objective-C不支持的类型:
· 泛型(Generics)
· 元组(Tuples)
· 在Swift中定义的枚举(Enumerations defined in Swift)
· 在Swift中定义的结构体(Structures defined in Swift)
· 在Swift中定义的顶级函数(Top-level functions defined in Swift)
· 在Swift中定义的全局变量(Global variables defined in Swift)
· 在Swift中定义的类型别名(Typealiases defined in Swift)
· Swift风格的variadics(Swift-style variadics)
· 嵌套类型(Nested types)
· Curried 函数(Curried functions)
 
3.Playground中,println()结果在哪里?
你必须打开Assistant Editor才能看到控制台输出。步骤:View > Assistant Editor > Show Assistant Editor,或者使用快捷键: Option + Command + Return.(感谢 Chris LaPollo的这个观点)
 
4.怎样在Playgrounds中看到那些很酷的值的图形?
你可以在Playgrounds里绘出值的结果,这对于可视化算法是很方便的。在playground里面输入能够产生值的代码:
 
 
  1. for x in 1..10 { 
  2.   x 
在侧边栏,你会看到类似于“9 times”的东西。把鼠标移到这一行上,会出现“+”按钮。点击这个按钮(并确保你打开了Assistant Editor),你将会看到图形。
 
5.你如何运行REPL?
在终端运行以下命令,告诉它使用Xcode 6的命令行工具。
 
 
  1. sudo xcode-select -s /Applications/Xcode6-Beta.app/Contents/Developer/ 
然后运行以下代码开始Swift REPL。
 
 
  1. xcrun swift 
如果准备退出,你可以键入:exit或者:quit。你也可以使用CTRL+D快捷键。
 
6.你能用Swift来调用自己的Objective-C代码或者第三方库吗?如果能,要怎么做呢?
可以!当你往Xcode项目里添加第一个.swift文件时,系统会提示你让Xcode创建一个桥接头文件(bridging header file)。你可以在这个头文件中导入你希望可见于Swift代码的Objective-C头文件。然后,所有的类无需导入都可为Swift所用,你可以使用和系统类相同的Swift语法来使用自定义Objective-C代码。  
 
7.那么,数组只能包含一个类型的对象吗?如果我想要不同的类型呢?
在Swift中,强烈建议你使用只包含一种类型的强类型数组,语法像是:
 
 
  1. var goodArray: String[] = ["foo""bar"
也就是说,从技术上讲,你依然可以创建包含多个类型对象的数组。但最好在做之前问问自己为什么想这么做。按照这种说法,你可以使用AnyObject:创建一个包含不同类型对象的Swift数组:
 
 
  1. var brokenArray: AnyObject[] = ["foo", 1, 12.23, true
8.对于字典(dictionary)也是一样吗?字典也是强类型(strongly typed)的吗?
是的,不过你依然可以用AnyObject来解决。对于字典来说,它里边所有的值不是同一个类型也讲得通。以下是用字典表示的从服务器端返回的一个JSON响应:
 
来看一个服务器JSON响应的例子,用字典来表示:
 
 
  1. var employee : Dictionary = ["FirstName" : "Larry""LastName" : "Rodgers""Salary" : 65_000.00] 
这个字典有两个String类型的键和一个Double值类型的键。虽然这是可行的,但可能的话你应该创建一级类模型对象来表示数据,而不是依赖字典。
 
具体细节
 
1.在Swift中有id的等价替代吗?
有。像上边提到的那样,当Objective-C API 返回id类型时,Swift使用AnyObject替换。AnyObject类型可以代表任何类类型的实例。另外也有Any可代表任何类型的实例(除了函数类型)。
 
2.如何在Swift中自省?(类似 if ([obj isKindOfClass:[Foo class]]) { … })
你可以使用is关键字检查变量或者常量的类型。编译器足够聪明让你知道使用is是多余的。由于Swift的类型安全机制,不大可能为同一个引用赋一个不同的类型,。
 
 
  1. var someValue : Any? 
  2.   
  3. someValue = "String" 
  4.   
  5. if someValue is String { 
  6.     println("someValue is a String"
  7. else { 
  8.     println("someValue is something else"
注意如果你想这么编写的话...
 
 
  1. var someValue = "String" 
  2.   
  3. if someValue is String { 
  4.     println("someValue is a String"
  5. else { 
  6.     println("someValue is something else"
你会收到一个编译器警告:
 
 
  1. Playground execution failed: error: :7:14: error: 'is' test is always true 
  2. if someValue is String { 
 
3.如何在Swift的枚举中存放位移值?(i.e. MyVal = 1<<5) 
不幸的是苹果尚未解决这个问题。不过有传言称他们正努力在这方面做的更好。按照这个说法,我们需要今天编写代码,对吧?以下是别人如何做到了这一点。
 
Nate Cook使用以下方案处理这个问题,你可以在 Stack Overflow上查看更多细节:
 
 
  1. struct MyOptions : RawOptionSet { 
  2.     var value: UInt = 0 
  3.     init(_ value: UInt) { self.value = value } 
  4.     func toRaw() -> UInt { return self.value } 
  5.     func getLogicValue() -> Bool { return self.value != 0 } 
  6.     static func fromRaw(raw: UInt) -> MyOptions? { return MyOptions(raw) } 
  7.     static func fromMask(raw: UInt) -> MyOptions { return MyOptions(raw) } 
  8.   
  9.     static var None: MyOptions          { return MyOptions(0) } 
  10.     static var FirstOption: MyOptions   { return MyOptions(1 << 0) } 
  11.     static var SecondOption: MyOptions  { return MyOptions(1 << 1) } 
  12.     static var ThirdOption: MyOptions   { return MyOptions(1 << 2) } 
  13.   
  14. func == (lhs: MyOptions, rhs: MyOptions) -> Bool     { return lhs.value == rhs.value } 
  15. func | (lhs: MyOptions, rhs: MyOptions) -> MyOptions { return MyOptions(lhs.value | rhs.value) } 
  16. func & (lhs: MyOptions, rhs: MyOptions) -> MyOptions { return MyOptions(lhs.value & rhs.value) } 
  17. func ^ (lhs: MyOptions, rhs: MyOptions) -> MyOptions { return MyOptions(lhs.value ^ rhs.value) } 
教程组成员 Chris LaPollo想到了下边更简单的方法,你可以在他的 帖子里阅读更多内容。
 
 
  1. class MyOptions { 
  2.   class var None   : UInt32 { return 0 } 
  3.   class var All    : UInt32 { return UInt32.max } 
  4.   class var First  : UInt32 { return 1 } 
  5.   class var Second : UInt32 { return 1<<1 } 
  6.   class var Third  : UInt32 { return 1<<2 } 
范例用法
 
 
  1. physicsBody.categoryBitMask = MyOptions.First 
  2. physcisBody.collisionBitMask = MyOptions.First | MyOptions.Second 
Dave Lawson也写了一篇你可能感兴趣的文章: Implementing NS_OPTIONS in Swift  
 
以上是几则相关的处理方法,不过希望苹果在以后的版本中会解决这个问题。
 
4.Swift如何和Grand Central Dispatch一起使用?
同样的方法,你可以像在Objective-C中那样使用C API.在处理并发性时,你也可以使用苹果高级NSOperationQueue。
 
5.Objective-C中的国际化宏命令呢?
类似Objective-C中的NSLocalizedString,你可以在Swift中使用NSLocalizedString(key:tableName:bundle:value:comment:) 方法为国际化做准备。tableName、bundle以及value arguments都有默认值,所以如果你正使用NSLocalizedString,你可以编写如下代码:
 
 
  1. dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), { 
  2.     println("test"
  3. }); 
6.我需要担心引用生命周期吗?
当然!当两个对象彼此之间是强引用时,仍能创建一个retain cycle。你可以使用Objective-C中一样的方法break这个retain  cycle。有三个关键字用于声明引用类型,详情如下,弱引用和无主引用将解决你的引用生命周期问题。
 
何时应该使用强引用、弱引用以及无主引用呢?
强引用:强引用会使得ARC保留实例直到不再需要它们。当移除所有强引用时,引用实例就会被释放。注意默认情况下强引用是隐式的, 所以你不必显式地声明它。
 
弱引用:你应该在独立生命周期的对象间使用弱引用。当为一个对象设置弱引用时,如果出于内存压力释放了对象,表示你不介意这一点。弱引用的值必须是一个变量,使用var定义 ,并且必须是使用?运算符的Optional类型。由于弱引用是可选的,所以你决不能以一个已经不存在的无效实例的引用来结束。当引用实例被释放时,ARC将会自动把引用设 置为nil。
 
无主引用:你应该为有相同生命周期的对象使用无主引用;比如当一个对象指向其自身,以及你希望避免一个retain cycle。无论何时只要引用有一个值就可以使用无主引用,但当你需要告诉ARC不要将它设置为nil时。无主引用的行为类似于Objective-C的unsafe_unretained。你要确保你不会在引用对象被释放后访问引用,这样会导致你的 app崩溃。无主引用不能是可选的,不能被设置为nil。无主引用也是隐式解析。
 
分号去哪里了?
分号在Swift中是可选的,不过出于易读性的目的,苹果建议你不要再使用分号了。但有时候仍会在Swift中使用分号,比如在循环语句中。
 
下一步做什么?
这仅仅是版本1,苹果的目的非常清楚,他们将在该语言上进行迭代,所以你可以向苹果报告bug,要求新特性等等。在该版本正式发布之前,仍有很大的提升空间。
 
CocoaPods如何适用于swift?
可能以类似的方式。Swift项目仍然是Xcode项目,并且支持多个target,但是有提升创建模块和自定义框架能力的潜在空间。有可能会重新改写CocoaPods以适应这个新特性。有人使用CocoaPods协助Swift项目工作,并且聪明的CocoaPods开发人员 已经在讨论这个问题了
 
 
推荐阅读:
Matt Galloway《 Swift language highlights》( 中文版
从今天开始学习Swift

转载地址:http://www.cocoachina.com/newbie/basic/2014/0618/8872.html

推荐阅读
  • 第六章:枚举类型与switch结构的应用分析
    第六章深入探讨了枚举类型与 `switch` 结构在编程中的应用。枚举类型(`enum`)是一种将一组相关常量组织在一起的数据类型,广泛存在于多种编程语言中。例如,在 Cocoa 框架中,处理文本对齐时常用 `NSTextAlignment` 枚举来表示不同的对齐方式。通过结合 `switch` 结构,可以更清晰、高效地实现基于枚举值的逻辑分支,提高代码的可读性和维护性。 ... [详细]
  • 优化后的标题:深入探讨网关安全:将微服务升级为OAuth2资源服务器的最佳实践
    本文深入探讨了如何将微服务升级为OAuth2资源服务器,以订单服务为例,详细介绍了在POM文件中添加 `spring-cloud-starter-oauth2` 依赖,并配置Spring Security以实现对微服务的保护。通过这一过程,不仅增强了系统的安全性,还提高了资源访问的可控性和灵活性。文章还讨论了最佳实践,包括如何配置OAuth2客户端和资源服务器,以及如何处理常见的安全问题和错误。 ... [详细]
  • 在对WordPress Duplicator插件0.4.4版本的安全评估中,发现其存在跨站脚本(XSS)攻击漏洞。此漏洞可能被利用进行恶意操作,建议用户及时更新至最新版本以确保系统安全。测试方法仅限于安全研究和教学目的,使用时需自行承担风险。漏洞编号:HTB23162。 ... [详细]
  • 深入剖析Java中SimpleDateFormat在多线程环境下的潜在风险与解决方案
    深入剖析Java中SimpleDateFormat在多线程环境下的潜在风险与解决方案 ... [详细]
  • 在Cisco IOS XR系统中,存在提供服务的服务器和使用这些服务的客户端。本文深入探讨了进程与线程状态转换机制,分析了其在系统性能优化中的关键作用,并提出了改进措施,以提高系统的响应速度和资源利用率。通过详细研究状态转换的各个环节,本文为开发人员和系统管理员提供了实用的指导,旨在提升整体系统效率和稳定性。 ... [详细]
  • 本文深入解析了WCF Binding模型中的绑定元素,详细介绍了信道、信道管理器、信道监听器和信道工厂的概念与作用。从对象创建的角度来看,信道管理器负责信道的生成。具体而言,客户端的信道通过信道工厂进行实例化,而服务端则通过信道监听器来接收请求。文章还探讨了这些组件之间的交互机制及其在WCF通信中的重要性。 ... [详细]
  • 深入解析CAS机制:全面替代传统锁的底层原理与应用
    本文深入探讨了CAS(Compare-and-Swap)机制,分析了其作为传统锁的替代方案在并发控制中的优势与原理。CAS通过原子操作确保数据的一致性,避免了传统锁带来的性能瓶颈和死锁问题。文章详细解析了CAS的工作机制,并结合实际应用场景,展示了其在高并发环境下的高效性和可靠性。 ... [详细]
  • 在使用 Qt 进行 YUV420 图像渲染时,由于 Qt 本身不支持直接绘制 YUV 数据,因此需要借助 QOpenGLWidget 和 OpenGL 技术来实现。通过继承 QOpenGLWidget 类并重写其绘图方法,可以利用 GPU 的高效渲染能力,实现高质量的 YUV420 图像显示。此外,这种方法还能显著提高图像处理的性能和流畅性。 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • 如何撰写适应变化的高效代码:策略与实践
    编写高质量且适应变化的代码是每位程序员的追求。优质代码的关键在于其可维护性和可扩展性。本文将从面向对象编程的角度出发,探讨实现这一目标的具体策略与实践方法,帮助开发者提升代码效率和灵活性。 ... [详细]
  • 短信验证码安全性堪忧,多因素认证或成未来主流
    短信验证码安全性堪忧,多因素认证或成未来主流 ... [详细]
  • 提升 Kubernetes 集群管理效率的七大专业工具
    Kubernetes 在云原生环境中的应用日益广泛,然而集群管理的复杂性也随之增加。为了提高管理效率,本文推荐了七款专业工具,这些工具不仅能够简化日常操作,还能提升系统的稳定性和安全性。从自动化部署到监控和故障排查,这些工具覆盖了集群管理的各个方面,帮助管理员更好地应对挑战。 ... [详细]
  • 尽管我们尽最大努力,任何软件开发过程中都难免会出现缺陷。为了更有效地提升对支持部门的协助与支撑,本文探讨了多种策略和最佳实践,旨在通过改进沟通、增强培训和支持流程来减少这些缺陷的影响,并提高整体服务质量和客户满意度。 ... [详细]
  • iOS 设备唯一标识获取的高效解决方案与实践
    在iOS 7中,苹果公司再次禁止了对MAC地址的访问,使得开发者无法直接获取设备的物理地址。为了在开发过程中实现设备的唯一标识,苹果推荐使用Keychain服务来存储和管理唯一的标识符。此外,还可以结合其他技术手段,如UUID和广告标识符(IDFA),以确保设备的唯一性和安全性。这些方法不仅能够满足应用的需求,还能保护用户的隐私。 ... [详细]
  • MySQL数据库安装图文教程
    本文详细介绍了MySQL数据库的安装步骤。首先,用户需要打开已下载的MySQL安装文件,例如 `mysql-5.5.40-win32.msi`,并双击运行。接下来,在安装向导中选择安装类型,通常推荐选择“典型”安装选项,以确保大多数常用功能都能被正确安装。此外,文章还提供了详细的图文说明,帮助用户顺利完成整个安装过程,确保数据库系统能够稳定运行。 ... [详细]
author-avatar
禹Ayu
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有