iOS 9
WWDC 2015 虽不像往届那样精彩纷呈,但却丝毫不缺乏亮点。 watchOS 2 包含改良过的 WatchKit,Apple Watch 硬件访问权限以及表盘插件支持。Swift 也有大量改进,并且宣布了未来的开源计划。全新的框架,包括:Contacts,ContactsUI 和 CoreSpotlight,还有一些新 UIKit 类型,比如:UIStack
,SFSafari
。
我们会在未来数周甚至数月内深入地探讨这些主要的改进。不过现在,我们先来一起看看 iOS 9 给我们熟悉和热爱的 API 带来了哪些改进。
字符串变形
以前深藏在 Core Foundation 的字符串变形这次被带到了 NSString
和 Swift String
中。这让 Cocoa 这项强大功能变得十分易用,因为不用再去理会桥接 CFString
所带来的麻烦。下面是一些使用新 NSString
常量来进行字符串变形的例子:
音译
"privet".string By Applying Transform(NSString Transform Latin To Cyrillic, reverse: false)
// "привет"
"안녕하세요".string By Applying Transform(NSString Transform Latin To Hangul, reverse: true)
// "annyeonghaseyo"
"annyeonghaseyo".string By Applying Transform(NSString Transform Latin To Hangul, reverse: false)
// "안녕하세요"
NSLog(@"%@", [@"privet" string By Applying Transform:NSString Transform Latin To Cyrillic reverse:NO]);
// "привет"
NSLog(@"%@", [@"annyeonghaseyo" string By Applying Transform:NSString Transform Latin To Hangul reverse:NO]);
// "안녕하세요"
NSLog(@"%@", [@"안녕하세요" string By Applying Transform:NSString Transform Latin To Hangul reverse:YES]);
// "annyeonghaseyo"
Unicode 名称
"🐷".string By Applying Transform(NSString Transform To Unicode Name, reverse: false)
// "{PIG FACE}"
NSLog(@"%@", [@"🐷" string By Applying Transform:NSString Transform To Unicode Name reverse:NO]);
// "{PIG FACE}"
规格化用户输入
"Hello! こんにちは! สวัสดี! مرحبا! 您好!"
.string By Applying Transform(NSString Transform To Latin, reverse: false)?
.string By Applying Transform(NSString Transform Strip Diacritics, reverse: false)?
.localized Lowercase String
.components Separated By Characters In Set(NSCharacter Set.whitespace Character Set())
// ["hello!", "kon'nichiha!", "swasdi!", "mrhba!", "nin", "hao!"]
NSString *input = @"Hello! こんにちは! สวัสดี! مرحبا! 您好!";
NSString *processing = [input string By Applying Transform:NSString Transform To Latin reverse:NO];
processing = [processing string By Applying Transform:NSString Transform Strip Diacritics reverse:NO];
NSArray<NSString *> *output = [processing.localized Lowercase String
components Separated By Characters In Set:[NSCharacter Set whitespace Character Set]];
NSLog(@"%@", output);
// ["hello!", "kon'nichiha!", "swasdi!", "mrhba!", "nin", "hao!"]
想要了解更多,一定不要错过 Mattt 的 CFString
。
CLLocationManager.requestLocation
Core Location 包含了一个新的轻量 API,用来单次获取用户位置信息。request
使用和连续更新一样的代理方法,在发送完期望精度的位置信息后,会自动将自己关闭:
class View Controller : UIView Controller, CLLocation Manager Delegate {
let location Manager = CLLocation Manager()
// ...
override func view Did Load() {
super.view Did Load()
location Manager.delegate = self
location Manager.desired Accuracy = k CLLocation Accuracy Hundred Meters
location Manager.request Location()
}
// MARK: - CLLocation Manager Delegate
func location Manager(manager: CLLocation Manager, did Update Locations locations: [CLLocation]) {
if let location = locations.first {
print("Current location: \(location)")
} else {
// ...
}
}
func location Manager(manager: CLLocation Manager, did Fail With Error error: NSError) {
print("Error finding location: \(error.localized Description)")
}
}
Swift 化
iOS 9 和 OS X 10.11 对 Cocoa API 进行了数千项小改进,使 Swift 互用性变得更加安全和简单。这些改进从熟悉的空值标注开始,将隐式打开地参数和返回值变为真正的 Optional 或者非 Optional 的数据类型。
比如,许多 API 将以前 NSArray
类型的返回值从空值改为了空数组,语义上看,它们是同义的,但是非 Optional 数组易用很多。此外,许多 Cocoa API 开始利用 Objective-C 中新加入的泛型语法来提供类型化数组。前面提到 CLLocation
中 location
方法就是这么一个例子:之前 locations
参数是 Any
数组,现在变成了 CLLocation
数组,从而省去了在方法体中还要另外转型的麻烦。
最后,许多之前 Swift 根本无法访问的 API 也被修正了,比如,用来获取特殊 UIAppearance
的代理方法。过去的 appearance
是用 C 可变参数实现的;新的 appearance
则用数组作为参数:
UIBar Button Item.appearance When Contained In Instances Of Classes([UINavigation Controller.self]).tint Color = UIColor.red Color()
[UIBar Button Item appearance When Contained In Instances Of Classes:@[[UINavigation Controller class]]].tint Color = [UIColor red Color];
可笑的是, Swift 在每次调用这个方法时都会崩溃。 Beta 毕竟是 Beta 啊。
NSFormatter 增进
Contacts 框架包含了用于本地化联系人和地址的 NSFormatter
子类以及一个新 Foundation NSPerson
类。我们会在未来几周内详细介绍,不过现在先来看看 NSNumber
和 NSDate
有哪些新的亮点。
NSNumberFormatter
首先,iOS 9 中 NSNumber
增加四个额外样式,.Ordinal
用于将数字转换为序数形式:
let formatter = NSNumber Formatter()
formatter.number Style = .Ordinal Style
let numbers = [1, 2, 3, 4, 5]
numbers.map { formatter.string From Number($0)! }
// ["1st", "2nd", "3rd", "4th", "5th"]
formatter.locale = NSLocale(locale Identifier: "es")
numbers.map { formatter.string From Number($0)! }
// ["1º", "2º", "3º", "4º", "5º"]
NSNumber Formatter *formatter = [[NSNumber Formatter alloc] init];
formatter.number Style = NSNumber Formatter Ordinal Style;
NSArray<NSNumber *> *numbers = @[@1, @2, @3, @4, @5];
for (NSNumber *number in numbers) {
NSLog(@"%@", [formatter string From Number:number]);
}
// "1st", "2nd", "3rd", "4th", "5th"
formatter.locale = [NSLocale locale With Locale Identifier:@"es"];
for (NSNumber *number in numbers) {
NSLog(@"%@", [formatter string From Number:number]);
}
// "1º", "2º", "3º", "4º", "5º"
其次,现有的 .Currency
新增了 .Currency
,.Currency
和 .Currency
。当使用这些新样式的时候,确保你的区域设置中包含语言以及国家和地区,这样才能保证格式器选择正确的货币和表达:
let styles: [NSNumber Formatter Style] = [.Currency Style, .Currency Plural Style,
.Currency ISOCode Style, .Currency Accounting Style]
formatter.locale = NSLocale(locale Identifier: "en_US")
styles.map {
formatter.number Style = $0
return formatter.string From Number(-125)!
}
// ["-$125.00", "-125.00 US dollars", "-USD125.00", "($125.00)"]
formatter.locale = NSLocale(locale Identifier: "es_ES")
styles.map {
formatter.number Style = $0
return formatter.string From Number(-125)!
}
// ["-125,00 €", "-125,00 euros", "-125,00 EUR", "-125,00 €"]
NSDateFormatter
再次,称 set
为 NSDate
的新方法可能有点将就。早在 iOS 8 它就被加入进来,直到今年的 Internationalization 讲座中才被大家所熟知。这个新方法使得定义日期和时间模版变得极其简单;虽然真正的格式化还是由 NSDate
来完成:
let now = NSDate()
// full date and time
let full Formatter = NSDate Formatter()
full Formatter.set Localized Date Format From Template("yyyy MMMMddhhmm")
// month name and year only
let short Formatter = NSDate Formatter()
short Formatter.set Localized Date Format From Template("yy MMMM")
full Formatter.string From Date(now)
// "June 23, 2015, 4:56 PM"
short Formatter.string From Date(now)
// "June 15"
// switch locales to "de_DE"
full Formatter.locale = NSLocale(locale Identifier: "de_DE")
short Formatter.locale = NSLocale(locale Identifier: "de_DE")
full Formatter.string From Date(now)
// "Juni 23, 2015, 4:56 nachm."
short Formatter.string From Date(now)
// "Juni 15"
好了,以上就是 iOS 9 新 API 的大致介绍,虽然还有很多我们没有涉及到的地方。你对 iOS 9 或者 OS X 10.11 的哪些新功能最感兴趣呢?参考下苹果的官方文档,然后告诉我们吧!