2016年10月12日
Objective-C id为Swift Any
Swift 3接口与Objective-C API以比以前的版本更强大的方式。例如,Swift 2将Objective-C中的id类型映射到Swift中的AnyObject类型,通常只能保存类类型的值。 Swift 2还为AnyObject提供了对一些桥接值类型(例如String,Array,Dictionary,Set和一些数字)的隐式转换,以方便使用本地Swift类型可以很容易地与期望NSString,NSArray或基础的其他容器类。这些转换与语言的其他部分不一致,使得很难理解什么可以用作AnyObject,导致错误。
在Swift 3中,Objective-C中的id类型现在映射到Swift中的Any类型,它描述了任何类型的值,无论是类,枚举,结构还是任何其他Swift类型。这种变化使得Swift中的Objective-C API更加灵活,因为Swift定义的值类型可以传递给Objective-C API,并作为Swift类型提取,从而无需手动“框”类型。这些优点也扩展到集合:Objective-C集合类型NSArray,NSDictionary和NSSet,以前只接受AnyObject的元素,现在可以保存任何类型的元素。对于散列容器,例如Dictionary和Set,有一个新类型AnyHashable可以容纳任何类型的值符合Swift Hashable协议。总之,以下类型映射从Swift 2更改为Swift 3:
在许多情况下,您的代码不必为响应此更改而显着更改。 Swift 2中的代码依赖于隐式转换为AnyObject的值类型,它将继续按照Any的原样在Swift 3中工作。但是,有些地方需要更改声明的变量和方法类型,并获得Swift 3的最佳体验。另外,如果你的代码显式使用AnyObject或Cocoa类,如NSString,NSArray或NSDictionary,你将需要引入更多的显式转换使用作为NSString或作为字符串,因为对象和值类型之间的隐式转换不再允许在Swift 3中。Xcode中的自动迁移器将进行最小的更改,以保持您的代码编译从Swift 2到3,但结果可能不总是最优雅的东西。本文将介绍您可能需要做的一些更改,以及在更改代码以充分利用ID作为Any时的一些缺陷。
覆盖方法和符合协议
当子类化一个Objective-C类并覆盖它的方法,或者符合一个Objective-C协议,当父方法在Objective-C中使用id时,需要更新方法的类型签名。 一些常见的例子是NSObject类的isEqual:方法和NSCopying协议的copyWithZone:方法。 在Swift 2中,你将写一个符合NSCopying的NSObject子类,如下所示:
// Swift 2
class Foo: NSObject, NSCopying {
override func isEqual(_ x: AnyObject?) -> Bool { ... }
func copyWithZone(_ zone: NSZone?) -> AnyObject { ... }
}
在Swift 3中,除了将命名从copyWithZone(_ :)更改为copy(with :)之外,还需要将这些方法的签名更改为Any而不是AnyObject:
// Swift 3
class Foo: NSObject, NSCopying {
override func isEqual(_ x: Any?) -> Bool { ... }
func copy(with zone: NSZone?) -> Any { ... }
}
非类型集合
属性列表,JSON和用户信息字典在Cocoa中很常见,Cocoa本地将这些表示为非类型化集合。 在Swift 2中,为此目的,需要构建Array,Dictionary或Set with AnyObject或NSObject元素,依靠隐式桥接转换来处理值类型:
// Swift 2
struct State {
var name: String
var abbreviation: String
var population: Int
var asPropertyList: [NSObject: AnyObject] {
var result: [NSObject: AnyObject] = [:]
// Implicit conversions turn String into NSString here…
result["name"] = self.name
result["abbreviation"] = self.abbreviation
// …and Int into NSNumber here.
result["population"] = self.population
return result
}
}
let california = State(name: "California",
abbreviation: "CA",
population: 39_000_000)
NSNotification(name: "foo", object: nil,
userInfo: california.asPropertyList)
或者,您可以使用Cocoa容器类,例如NSDictionary:
// Swift 2
struct State {
var name: String
var abbreviation: String
var population: Int
var asPropertyList: NSDictionary {
var result = NSMutableDictionary()
// Implicit conversions turn String into NSString here…
result["name"] = self.name
result["abbreviation"] = self.abbreviation
// …and Int into NSNumber here.
result["population"] = self.population
return result.copy()
}
}
let california = State(name: "California",
abbreviation: "CA",
population: 39_000_000)
// NSDictionary then implicitly converts to [NSObject: AnyObject] here.
NSNotification(name: "foo", object: nil,
userInfo: california.asPropertyList)
在Swift 3中,隐式转换已经消失,因此上述两个片段都不会按原样工作。 迁移者可以建议个别转换每个值作为转换,以保持此代码的工作,但有一个更好的解决方案。 Swift现在导入Cocoa API接受Any和/或AnyHashable的集合,所以我们可以更改集合类型为[AnyHashable:Any]而不是[NSObject:AnyObject]或NSDictionary,而不更改任何其他代码:
// Swift 3
struct State {
var name: String
var abbreviation: String
var population: Int
// Change the dictionary type to [AnyHashable: Any] here...
var asPropertyList: [AnyHashable: Any] {
var result: [AnyHashable: Any] = [:]
// No implicit conversions necessary, since String and Int are subtypes
// of Any and AnyHashable
result["name"] = self.name
result["abbreviation"] = self.abbreviation
result["population"] = self.population
return result
}
}
let california = State(name: "California",
abbreviation: "CA",
population: 39_000_000)
// ...and you can still use it with Cocoa API here
Notification(name: "foo", object: nil,
userInfo: california.asPropertyList)
AnyHashable类型Swift的Any类型可以保存任何类型,但是Dictionary和Set需要的键是Hashable,所以Any是太普通。从Swift 3开始,Swift标准库提供了一个新的类型AnyHashable。与Any类似,它充当所有Hashable类型的父类型,因此String,Int和其他hashable类型的值可以隐式地用作AnyHashable值,AnyHashable中的类型可以使用is,as !,动态检查,或作为?动态转换运算符。当从Objective-C导入无类型的NSDictionary或NSSet对象时,使用AnyHashable,但是在纯Swift中也可用于构建异构集合或字典。未链接上下文的显式转换在某些有限的情况下,Swift不能自动桥接C和Objective-C构造。例如,一些C和Cocoa API使用id *指针作为“out”或“in-out”参数,并且由于Swift不能静态地确定指针的使用方式,因此它不能对内存中的值执行桥接转换自动。在这种情况下,指针仍将显示为UnsafePointer。如果您需要使用这些非桥接API之一,您可以使用显式桥接转换,在代码中使用Type或AnyObject显式编写。
// ObjC@interface Foo
- (void)updateString:(NSString **)string;
- (void)updateObject:(id *)obj;
@end
// Swift
func interactWith(foo: Foo) -> (String, Any) {
var string = "string" as NSString // explicit conversion
foo.updateString(&string) // parameter imports as UnsafeMutablePointer<NSString>
let finishedString = string as String
var object = "string" as AnyObject
foo.updateObject(&object) // parameter imports as UnsafeMutablePointer<Anobject>
let finishedObject = object as Any
return (finishedString, finishedObject)
}
此外,Objective-C协议在Swift中仍然是类约束,所以你不能让Swift结构或枚举直接符合Objective-C协议或者使用轻量级的泛型类。 您需要使用这些协议和API显式转换String作为NSString,Array作为NSArray等。
AnyObject成员查找
任何没有与AnyObject相同的魔法方法查找行为。 这可能会破坏一些Swift 2代码,查找属性或发送消息到一个无类型的Objective-C对象。 例如,这个Swift 2代码:
将description描述不是Swift 3中的Any的成员。可以将x [0]的值转换为AnyObject以获取动态行为:
或者,将值强制转换为您期望的具体对象类型:
Swift中的值类型
任何可以持有任何结构,枚举,元组,或其他Swift类型,你可以在语言中定义。 Swift 3中的Objective-C桥接器可以提供任何Swift值作为Objective-C的id兼容对象。 这使得更容易在Cocoa容器,userInfo字典和其他对象中存储自定义Swift值类型。 例如,在Swift 2中,您需要将数据类型更改为类,或者手动加载它们,以将它们的值附加到NSNotification:
使用Swift 3,我们可以取消该框,并将对象直接附加到通知:
在Objective-C中,CreditCard值将作为一个id兼容的NSObject对象,使用Swift的Equatable,Hashable和CustomStringConvertible实现实现isEqual:,hash和描述,如果它们对于原始的Swift类型存在的话。 从Swift中,可以通过将其动态地转换回其原始类型来检索该值:
请注意,在Swift 3.0中,一些常见的Swift和Objective-C结构类型将桥接为不透明对象,而不是惯用的Cocoa对象。例如,Int,UInt,Double和Bool桥接到NSNumber,其他大小的数字类型,例如Int8,UInt16等只桥接为不透明对象。可变结构如CGRect,CGPoint和CGSize也作为不透明对象桥接,即使大多数Cocoa API与它们一起作为对象期望它们在NSValue实例中被装箱。如果你看到像无法识别的选择器发送到_SwiftValue的错误,这表明Objective-C代码试图调用一个不透明的Swift值类型的方法,并且你可能需要手动在该类的实例中将该值赋值为Objective-C代码期望。
要注意的一个特殊问题是Optionals。 Swift Any可以保存任何东西,包括一个Optional,所以可以将一个包装的Optional传递给Objective-C API,而不首先检查它,即使API被声明为采用一个非null的id。这通常表现为涉及_SwiftValue的运行时错误,而不是编译时错误。 Xcode 8.1 beta中包含的Swift 3.0.1通过实现这些建议来透明地处理数字类型,Objective-C结构和可选,以解决NSNumber,NSValue和可选桥接中的上述限制:
SE-0139:将数字类型桥接到NSNumber,将Cocoa Structs桥接到NSValue
SE-0140:当可选转换为Any时发出警告,并桥接可选作为其有效负载或NSNull
为了避免向前兼容性问题,你不应该依赖_SwiftValue类的不透明对象的实现细节,因为未来版本的Swift可能允许更多的Swift类型桥接到惯用的Objective-C类。
Linux可移植性
在Linux上使用Swift Core Swift运行的Swift程序库使用了Swift中本地编写的一个Foundation版本,没有Objective-C运行时桥接。 id-as-Any允许Core Libraries直接使用本地Swift Any和标准库值类型,同时使用Objective-C Foundation实现保持与Apple平台上的代码兼容。由于Swift在Linux上不与Objective-C交互操作,因此不支持桥接转换,例如字符串为NSString或值为AnyObject。希望在Cocoa和Swift Core Libraries之间移植的Swift代码应该只使用值类型。
学习更多
id-as-Any是Swift语言改进的一个很好的例子,受到用户对早期版本的Swift的反馈的启发,并通过来自开放的Swift Evolution过程的回顾完善。如果你想更多地了解id-as-Any背后的动机和设计决策,原始的Swift Evolution提议可以在GitHub的swift-evolution仓库中找到:
SE-0072:完全消除来自Swift的隐式桥接转换
SE-0116:将Objective-C id导入为Swift任何类型
SE-0131:将AnyHashable添加到标准库
最终结果是,Swift是一种更加一致的语言,当使用Swift时,Cocoa API变得更强大。
-----------------------------------------------------------------------------------------
2016年9月21日
使用iPad编程机器人与Swift游乐场
在WWDC 2016,我们宣布Swift Playgrounds,一个全新的iPad应用程序,使用Swift教授核心编码概念。除了苹果提供的应用程序的伟大内容,我们很高兴看到什么社区的Swift开发人员将构建和共享。我们在WWDC上展示了一个深入的会议,题为“Swift Playgrounds介绍”,展示了如何为iPad创建自己的`.playgroundbook'文件,包含多个页面,始终运行的实时视图和华丽的剪辑场景。
在这个WWDC会议期间,我们还展示了在舞台上控制Sphero SPRK +机器人,由iPad上的Swift Playgrounds驱动。因为Swift Playgrounds中的代码可以访问iOS SDK,包括CoreBluetooth框架,所以您可以编写可以完全控制这些机器人等设备的程序。我们更新了我们在WWDC展示的游乐场,以便您可以看到它是如何工作的,甚至进一步扩展到教你的机器人的新技巧。操场包含在这篇文章中,可以使用iCloud,AirDrop,电子邮件和许多其他方法共享到运行Swift Playgrounds的iPad。
当您在操场的第一页上运行代码时,您将看到一个触摸界面,用于手动驱动房间内的Sphero机器人。小心,它可以去真的快!点击操作区顶部的下一页字形移动到其他页面。在这里,您可以访问一个简单的API,使您可以使用代码来控制机器人,使编写简单的程序,移动机器人在一个正方形,图8,或任何其他设计,你可以梦想很容易。
要运行这个操场,你需要Swift Playgrounds应用程序和iOS 10运行在一个64位芯片的iPad上。您还需要一台能够使用蓝牙LE的Sphero机器人,例如BB-8或新的SPRK +。只要机器人在附近,操场就会找到它,让你使用Swift Playgrounds在你的iPad上控制它。
你可以从App Store下载Swift Playgrounds。
-----------------------------------------------------------------------------------------
2016年9月12日
在Swift中使用JSON
如果您的应用程序与Web应用程序通信,则从服务器返回的信息通常格式为JSON。您可以使用Foundation框架的JSONSerialization类将JSON转换为Swift数据类型,如Dictionary,Array,String,Number和Bool。然而,因为你不能确定你的应用程序接收到的JSON的结构或值,所以正确地反序列化模型对象可能是一个挑战。本文介绍了在应用中使用JSON时可以采用的几种方法。
从JSON提取值
JSONSerialization类方法jsonObject(with:options :)返回一个Any类型的值,如果无法解析数据,则抛出一个错误。
虽然有效的JSON可能只包含一个值,但Web应用程序的响应通常将对象或数组编码为顶级对象。你可以使用可选的绑定和as?在if或guard语句中键入cast运算符,以将已知类型的值提取为常量。要从JSON对象类型获取Dictionary值,请有条件地将其转换为[String:Any]。要从JSON数组类型获取Array值,有条件地将其转换为[Any](或具有更特定元素类型的数组,如[String])。您可以通过键或索引使用带有下标访问器的类型cast可选绑定或枚举的模式匹配来提取字典值。
Swift的内置语言功能可以轻松安全地提取和处理使用Foundation API解码的JSON数据,而无需使用外部库或框架。
从从JSON提取的值创建模型对象
由于大多数Swift应用程序都遵循Model-View-Controller设计模式,因此在模型定义中将JSON数据转换为特定于应用程序域的对象通常很有用。
例如,当编写为本地餐馆提供搜索结果的应用程序时,您可以实现一个带有初始化器的餐厅模型,该模型接受JSON对象和类型方法,向服务器的/搜索端点发出HTTP请求,然后异步返回数组的餐厅对象。
考虑下面的餐厅模型:
一个餐馆有一个类型为String的名称,一个表示为坐标对的位置,以及一套包含嵌套餐枚举值的膳食。
以下是在服务器响应中表示单个餐厅的示例:
编写可选的JSON初始化程序
要将JSON表示转换为Restaurant对象,请编写一个初始化器,它接受Any参数,该参数从JSON表示中提取数据并将其转换为属性。
如果您的应用程序与一个或多个不返回模型对象的单一一致表示的Web服务进行通信,请考虑实施几个初始化器来处理每个可能的表示。在上面的示例中,每个值都是从传递的JSON字典中提取的常量,使用可选绑定和as?型铸造操作器。对于name属性,提取的名称值被简单地分配为原样。对于坐标属性,提取的纬度和经度值在赋值之前组合成元组。对于meals属性,提取的字符串值被迭代以构造一组Meal枚举值。
使用错误处理编写JSON初始化程序
前面的示例实现了一个可选的初始化器,如果反序列化失败,则返回nil。或者,您可以定义符合错误协议的类型,并实现在反序列化失败时抛出该类型错误的初始化器。
这里,Restaurant类型声明一个嵌套的SerializationError类型,它定义了具有丢失或无效属性的相关值的枚举例。 在JSON初始化器的抛出版本中,不是通过返回nil来指示失败,而是抛出一个错误来传达特定的失败。 此版本还执行输入数据的验证,以确保坐标表示有效的地理坐标对,并且JSON中指定的每个膳食名称对应于膳食枚举情况。
编写用于获取结果的类型方法
Web应用程序端点通常在单个JSON响应中返回多个资源。 例如,/搜索端点可以返回匹配所请求的查询参数的零个或多个餐馆,并且包括那些表示以及其他元数据:
您可以在Restaurant结构上创建一个类型方法,将一个查询方法参数转换为相应的请求对象,并将HTTP请求发送到Web服务。 此代码还将负责处理响应,反序列化JSON数据,从“results”数组中的每个提取的字典创建Restaurant对象,并在完成处理程序中异步返回它们。
当用户在搜索栏中输入文本以填充具有匹配餐馆的表视图时,视图控制器可以调用此方法:
以这种方式分离问题提供了一种用于从视图控制器访问餐厅资源的一致的接口,即使当关于web服务的实现细节改变时。
反射反射
为了在不同系统之间进行通信而在相同数据的表示之间进行转换是一种繁琐的,尽管是必要的用于编写软件的任务。
因为这些表示的结构可以非常相似,所以可能很容易创建更高级别的抽象以在这些不同的表示之间自动映射。例如,类型可以定义snake_case JSON键和camelCase属性名之间的映射,以便使用Swift反射API(例如Mirror)从JSON自动初始化模型。
然而,我们发现,这些抽象类型不能提供比传统使用Swift语言特性更大的优势,反而使调试问题或处理边缘情况更加困难。在上面的示例中,初始化器不仅从JSON中提取和映射值,而且还初始化复杂数据类型并执行特定于域的输入验证。为了完成所有这些任务,基于反思的方法必须做很多工作。在评估您自己的应用程式的可用策略时,请记住这一点。少量复制的成本可能显着小于挑选不正确的抽象。
--------------------------------------------------------------------------------------
2016年6月20日
Swift 3和Xcode 8
Swift 3 beta刚刚作为Xcode 8 beta的一部分发布,包括许多增强功能,许多由开源社区贡献。 Swift 3的主要目标是实现最后的主要源代码更改,以允许Swift作为一致的语言进行合并,从而为将来的版本提供更稳定的语法。
Swift语法和Swift 3中的API重命名更改使语言感觉更自然,并在调用Cocoa框架时提供更多的Swift-y体验。 流行框架Core Graphics和Grand Central Dispatch在Swift中有新的,更干净的界面。 此版本还提高了构建性能,并包括许多小的修复,这将使它更有趣的使用每一天。
Xcode 8 beta包括一个Swift文件和游乐场的迁移器,以帮助您将现有代码移动到Swift 3。
Swift 2.3
除了Swift 3之外,Xcode 8还支持使用Swift 2.3进行开发,这是Swift 2.2语言的一个小小更新,用于与macOS Sierra,iOS 10,tvOS 10和watchOS 3的新SDK配合使用。这旨在允许开发人员 立即移动到这些最新的SDK,甚至对于可能迟到开发与Swift 2.2,还没有准备好移动到Swift 3的项目.Xcode 8可以迁移你的代码到新的Swift 2.3的变化,主要与可空性清晰度相关 到新的SDK。 例如:
Swift 2.2核心图像代码没有新的SDK可空性定义:
Swift 2.3代码使得failable初始化更清晰:
Swift 3是Xcode 8中支持的主要开发语言,因此如果您选择继续使用Swift 2.3,还需要考虑几个注意事项。首先,Swift 2.3和Swift 3不是二进制兼容的,所以你的应用程序的整个代码库需要选择一个版本的Swift。这两个版本都完全由编译器,SDK和调试器支持,但IDE的其他功能可能无法与Swift 2.3一起使用。例如,Xcode中的Playgrounds只适用于Swift 3,尤其是适用于iPad的Swift Playgrounds应用程序也使用Swift 3.Xcode项目模板都使用Swift 3,所有文档都以适合Swift 3的格式呈现。
当Xcode 8今年晚些时候,你将能够提交你的应用程序到App Store写的Swift 3.0或2.3。 Swift 3中的更改代表了Swift语言的未来,我们强烈建议您预算时间将Swift代码迁移到版本3.即使您之前首次迁移到Swift 2.3,也可以稍后运行Xcode 8迁移器从Swift 2.3移动到Swift 3。
-----------------------------------------------------------------------------
2016年2月8日
互动游乐场
Xcode 7.3 beta 3添加了交互式iOS和OS X游乐场,允许您单击,拖动,类型或以其他方式与您编写到操场中的用户界面交互。 这些接口的反应正如在一个完整的应用程序。 互动游乐场可以帮助您快速原型化和构建应用程序,并提供另一个伟大的方式与您的代码进行交互。
分配给XCPlaygroundPage的liveView属性的任何视图或视图控制器都会自动进行交互,并且由于它在操场中运行,因此您可以获得所有常见的操场结果。 你可以尝试手势识别器,看看UITableView如何在滚动时创建和出列单元格,或者与SceneKit中的复杂3D场景交互。
示例操场
下面是一个iOS游乐场,使用UIKit Dynamics创建一个完全交互和可定制的牛顿摇篮,完美的桌面。
--------------------------------------------------------------------------------------
2015年12月3日
Swift是开源
Swift现在是开源的。 今天,苹果推出了开源的Swift社区,以及令人惊叹的新工具和资源,包括:
Swift.org - 一个专门用于开源Swift社区的网站
公共源代码库在github.com/apple
一个新的Swift包管理器项目,轻松共享和构建代码
一个Swift本地核心库项目,具有高于标准库的高级功能
所有Apple平台和Linux的平台支持
现在任何人都可以下载代码和开发中的构建,以查看团队是什么。 更高级的开发人员有兴趣为项目贡献可以提出错误,参与社区,并贡献自己的修复和增强,使Swift更好。 对于生产App Store开发,您应该始终使用Xcode中包含的稳定版本的Swift,这仍然是提交应用程序的要求。
Swift.org
Swift.org是一个全新的网站,专门用于开源Swift。这个网站为开发人员的社区托管资源,他们希望帮助Swift发展,贡献修复,最重要的是相互交流。 Swift.org主机:
一个bug报告和跟踪系统
邮件列表
一个致力于Swift工程的博客
社区准则
入门教程
贡献说明
Swift的文档
开发人员和API设计指南
Swift.org是Swift的日常工程工作的地方,开发人员的团队一起工作,将Swift带到新平台,添加新功能,并不断改进我们最喜欢的语言。
源代码
苹果有一个新的家在GitHub位于github.com/apple,你可以找到所有的Swift项目的源代码。公共存储库包括Swift编译器,LLDB调试器和REPL,标准和核心库,包管理器和其他支持项目。
GitHub已经是开发者合作的一个令人难以置信的受欢迎的地方。可以很容易地在网站上查看源代码,或者快速签出代码到您的机器。当你有一个补丁贡献,我们接受拉请求。
Swift包管理器
今天我们还推出了一个全新的项目:Swift包管理器。这个早期阶段的项目将从开始就开放。存储库处于非常早期的状态,我们将一起定义一个伟大的包管理器应该做什么,以及我们如何使它直观的使用,并赋予它需要扩展到许多平台,我们期望Swift的繁荣。
核心库
苹果长期以来提供了丰富的框架集合,可以提供更广泛的各种软件通常需要的更高级的功能。诸如Foundation,libdispatch和XCTest等框架使编写复杂程序变得更加容易,我们希望确保开发人员在将Swift技能应用到新平台时获得同样的好处。无论是为iPhone或Mac编写应用程序,还是在Linux上构建新的云服务,Swift核心库都将为您提供可信赖的构建块。
平台
开源Swift在Mac上运行,能够为OS X,iOS,watchOS和tvOS构建应用程序。 Swift.org还提供了一个Linux版本的Swift,包含一个Linux工具包,包括包管理器支持,LLDB调试器和REPL。我们很高兴看到社区把Swift带到更多的新地方。随着学生和专业人员学会在Swift中编程,每个新平台和用例为他们在整个技术行业打开了新的机会。
入门
它很容易上手。 Swift.org托管用于Apple和Linux平台的编译器和命令行工具的二进制下载,因此您可以快速启动和运行。最新版本的Xcode支持一个替代的工具链选项,专门设计用于简单地从Xcode中试用最新的Swift开源构建。和Swift.org有很多入门指南,引导您完成设置环境以使用开源Swift的过程。
----------------------------------------------------------------------------------------
2015年10月7日
文字在游乐场
Xcode 7.1中的新功能是将文件,图像和颜色文字嵌入到操场的代码中。文字是以其原生格式表示的数据的实际值,直接在Xcode编辑器中。例如,没有必要在编辑器中键入“myImage.jpg” - 只需从Finder中拖动图像,实际图像将与您的代码一致显示。而不是显示RGB值来指示颜色,操场将渲染颜色色板。操场中的字面量与你在常规Swift代码中手工创作的代码类似,但是以更有用的方式呈现。
除了看起来很酷,文字也可以使编辑资源更快。您可以使用颜色选择器从调色板中快速选择不同的颜色。将文件从Finder拖放到您的Playground代码中,立即开始使用它们。您甚至可以通过选择编辑器>插入文件,图像或颜色文字在当前光标位置添加文字。双击文字可以轻松选择其他值。
如果需要,资源将被复制到您的playground的资源目录中,因此您的操场所需的所有内容都包含在文档中。因为文字是代码的一部分,所以您还可以复制,粘贴,移动和删除它们如何处理任何源代码。
文字在Swift代码
字面量转换为平台特定类型,其默认值如下:
要获得文字的完整的在线演示体验,您必须在操场上。 但是,如果将使用文字的代码复制并粘贴到主Swift源代码中,则粘贴的代码将按预期工作,Xcode将简单地将纯文本转换为纯文本。
为了让你开始使用文字,我们在这篇博文中包含了一个很短的操作。 下载最新的Xcode 7.1测试版,给这个操场一试。
其他文档
Xcode 7.1 beta 3附带的文档包括一个更新的游乐场帮助文档,其中包含操场上许多强大功能的新信息,包括文字的新内容。 这里是到相关子页面的直接链接:添加图片文字,添加颜色文字和添加文件文字。
下面是一个屏幕截图,演示了字面量在Xcode 7.1中的显示方式:
-----------------------
2015年9月21日
Swift 2在App Store中的应用程序