Optional变量初学者指南
苹果三周前发布了Swift。 从那时起,我一直在阅读Swift的官方指南,并在Xcode 6测试版中使用。 我开始喜欢Swift的简单和语法。 与我的团队一起,我仍然在研究新的语言,并看看它与Objective-C(一种30岁的编程语言)相比如何。 同时,我们正在努力工作,看看我们如何教初学者,帮助社区轻松应对Swift。
两周前,我们介绍了Swift的基础知识。 在接下来的几周内,我们将编写一系列教程,以涵盖Swift中的许多新功能。 本周,我们先来看看Optional变量。
Optionals 概览
我在上一篇文章中提到了可选项,但没有详细介绍。 那么什么是可选项? 在Swift中声明变量时,默认情况下它们被指定为非可选项。 换句话说,您必须为变量分配非空值。 如果您尝试将一个零值设置为非可选项,编译器会说:“你不能设置一个空值!”。
var message: String = "Swift is awesome!" // OK
message = nil // compile-time error
当然,错误消息不是那么用户友好,但它类似“__conversion’ that accepts the supplied arguments“。 同样适用于在类中声明属性时。 默认情况下,属性被指定为非可选属性。
class Messenger {
var message1: String = "Swift is awesome!" // OK
var message2: String // compile-time error
}
您将收到message2的编译时错误,因为它没有分配初始值。 对于来自Objective-C的用户,可能会有点惊讶。 在Objective-C中,在将nil分配给变量或声明没有初始值的属性时,不会得到任何编译时错误:
NSString *message = @"Objective-C will never die!";
message = nil; class Messenger {
NSString *message1 = @"Objective will never die!";
NSString *message2;
}
但是,这并不意味着您无法在Swift中分配初始值时声明属性。 Swift引入了可选类型来表示没有值。 它是通过添加问号来定义的? 运算符类型声明后。 这是一个例子:
class Messenger {
var message1: String = "Swift is awesome!" // OK
var message2: String? // OK
}
当变量被定义为可选时,仍然可以赋值。 但是,如果变量象上面的代码一样没有分配任何值,其值将自动默认为nil。
为什么要用 Optionals?
Swift是为安全而设计的。 正如苹果所说,可选项是Swift是一种类型的安全语言的例子。 从上面的例子可以看出,Swift的可选项提供编译时检查,可以防止在运行时发生一些常见的编程错误。 我们来看下面的例子,你将更好地了解可选项的功能。
在Objective-C中考虑以下方法:
- (NSString *)findStockCode:(NSString *)company {
if ([company isEqualToString:@"Apple"]) {
return @"AAPL";
} else if ([company isEqualToString:@"Google"]) {
return @"GOOG";
}
return nil;
}
您可以使用findStockCode:方法获取特定上市公司的股票代码。 为了演示目的,该方法只返回您的Apple和Google的股票代码。 对于其他输入,它返回空值。
假设该方法在同一个类中定义,我们使用它:
NSString *stockCode = [self findStockCode:@"Facebook"]; // nil is returned
NSString *text = @"Stock Code - ";
NSString *message = [text stringByAppendingString:stockCode]; // runtime error
NSLog(@"%@", message);
该代码可以正确编译,但是当该方法对Facebook返回nil时,运行该应用程序会抛出运行时异常。
使用Swift的可选项,它会在编译时显示错误,而不是在运行时发现错误。 如果我们在Swift中重写上述示例,它将如下所示:
func findStockCode(company: String) -> String? {
if (company == "Apple") {
return "AAPL"
} else if (company == "Google") {
return "GOOG"
}
return nil
} var stockCode:String? = findStockCode("Facebook")
let text = "Stock Code - "
let message = text + stockCode // compile-time error
println(message)
stockCode被定义为可选项。 这意味着它可以包含字符串或空值。 您无法执行上述代码,因为编译器检测到潜在错误(“可选类型String的值未展开”),并通知您进行更正。
从示例中可以看出,Swift的可选功能加强了空值检查,为开发人员提供了编译时的指引。 显然,使用可选项有助于更好的代码质量。
可选变量解包
那么我们该如何使代码工作? 显然,我们需要测试stockCode是否包含一个空值。 我们修改如下:
var stockCode:String? = findStockCode("Facebook")
let text = "Stock Code - "
if stockCode {
let message = text + stockCode!
println(message)
}
就像Objective-C对应的,我们使用if来查看可选项是否包含一个值。 一旦我们知道可选项必须包含一个值,我们通过在可选名称的末尾放置一个感叹号(!)来解开它。 在Swift,这被称为强制展开。 你用! 操作符打开可选项并显示底层值。
参考上面的例子,我们只在nil-check之后解开“stockCode”可选项。 我们知道可选量必须包含非零值,然后才能使用! 操作符。 始终建议确保可选项在解开之前包含一个值。
但是如果我们忘记下面的验证怎么办?
var stockCode:String? = findStockCode("Facebook")
let text = "Stock Code - "
let message = text + stockCode! // runtime error
将不会有编译时错误。 编译器假定可选的包含一个值,因为使用了强制展开。 运行应用程序时,将抛出运行时错误,并显示以下消息:
fatal error: Can’t unwrap Optional.None
可选绑定
除了强制解包之外,可选绑定是一种更简单和推荐的方式来打开可选的。 您使用可选绑定来检查可选项是否包含值。 如果它包含一个值,将其解开并将其放入临时常量或变量中。
没有比使用示例更好的解释可选绑定的方式。 我们将上一个示例中的示例代码转换为可选绑定:
var stockCode:String? = findStockCode("Facebook")
let text = "Stock Code - "
if let tempStockCode = stockCode {
let message = text + tempStockCode
println(message)
}
“if let”(或“if var”)是可选绑定的两个关键字。 通俗地,代码说“如果stockCode包含一个值,将其解开,将其值设置为tempStockCode并执行条件块。 否则,只是跳过块“。 由于tempStockCode是一个新的常量,您不再需要使用! 后缀访问其值。
您可以通过评估if语句中的函数来进一步简化代码:
let text = "Stock Code - "
if var stockCode = findStockCode("Apple") {
let message = text + stockCode
println(message)
}
这里的stockCode不是可选的,没有必要使用! 后缀访问条件块中的值。 如果从函数返回nil值,则不会执行该块。
可选链
在解释可选链接之前,让我们稍微调整一下原来的例子。 我们创建一个名为Stock的新类,其代码和价格属性是可选的。 findStockCode函数被修改为返回Stock类而不是String。
class Stock {
var code: String?
var price: Double?
} func findStockCode(company: String) -> Stock? {
if (company == "Apple") {
let aapl: Stock = Stock()
aapl.code = "AAPL"
aapl.price = 90.32 return aapl } else if (company == "Google") {
let goog: Stock = Stock()
goog.code = "GOOG"
goog.price = 556.36 return goog
} return nil
}
我们重写原始示例如下。 我们首先通过调用findStockCode函数找到股票代码/符号。 然后我们计算购买100股股票所需的总成本。
if let stock = findStockCode("Apple") {
if let sharePrice = stock.price {
let totalCost = sharePrice *
println(totalCost)
}
}
由于findStockCode()的返回值是可选的,我们使用可选绑定来检查它是否包含实际值。 显然,股票类的价格属性是可选的。 我们再次使用“if let”语句来测试stock.price是否包含非零值。
上述代码没有任何错误。 您可以使用可选链接来简化代码,而不是编写嵌套的“if set”。 该功能允许我们连接多个可选项与“?”操作符。 这是代码的简化版本:
if let sharePrice = findStockCode("Apple")?.price {
let totalCost = sharePrice *
println(totalCost)
}
可选链接提供了访问价格价值的另一种方法。 该代码现在看起来更清洁和更简单。 这里我只是介绍可选链接的基础知识。 您可以在Apple Swift指南中找到有关可选链接的更多信息。
Swift和Objective-C互操作性
Swift的可选功能非常强大,尽管可能需要一些时间来习惯语法。 可选项可以帮助您清楚代码可以使用的值,并避免错过无效。
Swift旨在与Objective-C API进行交互。 每当您需要与UIKit或其他框架API进行交互时,您一定会遇到可选项。 以下是实现表视图时遇到的一些可选项:
func numberOfSectionsInTableView(tableView: UITableView?) -> Int {
// Return the number of sections.
return
} func tableView(tableView: UITableView?, numberOfRowsInSection section: Int) -> Int {
// Return the number of rows in the section.
return recipes.count
} func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! {
let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as UITableViewCell cell.textLabel.text = recipes[indexPath.row] return cell
}
概要
了解可选项如何工作至关重要,这就是为什么我们将完整的文章用于可选项。 Swift中的可选项允许开发人员在编译时发现潜在的问题,从而在运行时防止意外的错误。 一旦你习惯了语法,你会欣赏可选的美丽。
和往常一样,我们很乐意听到您的反馈。 如果您对可选项有任何疑问或想分享您的想法,请随时给我们留言。
Optional变量初学者指南的更多相关文章
- Java多线程初学者指南系列教程
转自:http://developer.51cto.com/art/200911/162925.htm 51cto 本系列来自NokiaGuy的“真的有外星人吗”博客,系列名称为<Java多线程 ...
- 【系列】Java多线程初学者指南(1):线程简介
原文地址:http://www.blogjava.net/nokiaguy/archive/2009/nokiaguy/archive/2009/03/archive/2009/03/19/26075 ...
- FreeBSD上编写x86 Shellcode初学者指南
FreeBSD上编写x86 Shellcode初学者指南 来源 https://www.4hou.com/binary/14375.html 介绍 本教程的目的是帮助你熟悉如何在FreeBSD操作系统 ...
- Python编程初学者指南|百度网盘免费下载|Python新手入门资料
Python编程初学者指南|百度网盘免费下载 提取码:9ozx 目录 · · · · · · 第1章 启程:Game Over程序1.1 剖析Game Over程序1.2 Python简介1.2.1 ...
- 《Python编程初学者指南》高清PDF版|百度网盘免费下载|Python基础
<Python编程初学者指南>|百度网盘免费下载| 提取码:03b1 内容简介 Python是一种解释型.面向对象.动态数据类型的高级程序设计语言.Python可以用于很多的领域,从科学计 ...
- Python编程初学者指南PDF高清电子书免费下载|百度云盘
百度云盘:Python编程初学者指南PDF高清电子书免费下载 提取码:bftd 内容简介 Python是一种解释型.面向对象.动态数据类型的高级程序设计语言.Python可以用于很多的领域,从科学计算 ...
- NHibernate初学者指南系列文章导航
NHibernate初学者指南系列文章导航 前面的话 经过三个多周的时间,终于将这个系列完成了,谢谢大家的关注和支持,有很多不足之处还望大家包涵. 本系列参考的书籍为NHibernate 3 Be ...
- 【翻译】nginx初学者指南
nginx初学者指南 本文翻译自nginx官方网站:http://nginx.org/en/docs/beginners_guide.html#control 该指南会对nginx做一个简要的介绍,同 ...
- 《SQL初学者指南》——第1章 关系型数据库和SQL
第1章 关系型数据库和SQL SQL初学者指南在本章中,我们将介绍一些背景知识,以便于你能够很快地上手,能在后续的章节中编写SQL语句.本章有两个主题.首先是对本书所涉及到的数据库做一个概述,并且介绍 ...
随机推荐
- Web存储—简易注册登录
Web Storage是HTML5引入的一个非常重要的功能,可以在客户端本地存储数据,类似HTML4的cookie,但可实现功能要比cookie强大的多,cookie大小被限制在4KB,cookie只 ...
- noip2016普及组 题解
T1 大水题,不解释 上考场代码 #include <algorithm> #include <cstdio> using namespace std; int main() ...
- 为什么我们要使用Async、Await关键字
前不久,在工作中由于默认(xihuan)使用Async.Await关键字受到了很多质问,所以由此引发这篇博文“为什么我们要用Async/Await关键字”,请听下面分解: Async/Await关键字 ...
- jquery 获取及设置input各种类型的值 (转)
jQuery操作input值总结 获取选中的值 获取一组radio被选中项的值 var item = $("input[@name=items]:checked").val(); ...
- 怎么检测JDK环境变量是否配置正确
怎么检测JDK环境变量是否配置正确.. 点击开始--运行--输入cmd,点击确定. 在命令行窗口输入java 然后Enter.没有出现java既不是内部命令也不是外部命令.说明配置是正确的. 在命令 ...
- win7怎么更换锁屏壁纸
win7怎么更换锁屏壁纸... -------------------------- 按键盘组合键“Windows+R”可打开“运行”窗口,输入 “gpedit.msc” 按回 ----------- ...
- Eclipse关闭项目
Eclipse 关闭项目 为什么要关闭项目? Eclipse 工作空间包含了多个项目.一个项目可以是关闭或开启状态. 项目打开过多影响有: 消耗内存 占用编译时间:在删除项目.class 文件(Cle ...
- 理解javascript 对象,原型对象、闭包
javascript作为一个面向对象的语言,理解 对象.原型.闭包.模块模式等技术点对于成为一名合格的javascript程序员相当重要,多年没写过blog,今天就先拋个玉,在下基本也不做前端,但颇感 ...
- QQ无法通过ISA2006&TMG2010代理收发图片问题解决
近期公司有业务需求通过TMG访问QQ,但配置多次均无法通过QQ收发图片,文字输入正常. 目前已解决,供参考: 这个问题是SSL端口默认使用了443,但QQ的离线文件不使用这个端口.所以ISA会把QQ的 ...
- 用xml画水平虚线和竖直虚线.md
1.画水平虚线 直接建一个shape,设置stroke属性就行了,再将这个属性直接作为background的drawable属性引入就行了 注意在4.0以上的真机加一句 <?xml versio ...