<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>移动技术 &#187; IOS开发</title>
	<atom:link href="http://www.newlifeclan.com/mobile/archives/category/ios/feed" rel="self" type="application/rss+xml" />
	<link>http://www.newlifeclan.com/mobile</link>
	<description>又一个NewLifeClan站点</description>
	<lastBuildDate>Wed, 10 Jan 2024 09:33:26 +0000</lastBuildDate>
	<language>zh-CN</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.0.38</generator>
	<item>
		<title>swift之Optional（可选型）</title>
		<link>http://www.newlifeclan.com/mobile/archives/80</link>
		<comments>http://www.newlifeclan.com/mobile/archives/80#comments</comments>
		<pubDate>Thu, 11 Aug 2016 07:31:02 +0000</pubDate>
		<dc:creator><![CDATA[napoleon]]></dc:creator>
				<category><![CDATA[IOS开发]]></category>

		<guid isPermaLink="false">http://www.newlifeclan.com/mobile/?p=80</guid>
		<description><![CDATA[<p>之前学习 swift 的时候都是比较破碎，零零散散，以至于有些地方学习的不够透彻。所以趁最近有时间，就开始重新 [&#8230;]</p>
<p><a rel="nofollow" href="http://www.newlifeclan.com/mobile/archives/80">swift之Optional（可选型）</a>，首发于<a rel="nofollow" href="http://www.newlifeclan.com/mobile">移动技术</a>。</p>
]]></description>
				<content:encoded><![CDATA[<p><img class="size-full wp-image-84 aligncenter" src="http://www.newlifeclan.com/mobile/wp-content/uploads/sites/6/2016/08/1470654082354267.jpg" alt="1470654082354267" width="600" height="279" /></p>
<p>之前学习 swift 的时候都是比较破碎，零零散散，以至于有些地方学习的不够透彻。所以趁最近有时间，就开始重新学习 swift ，从最基本的开始学习，希望能深入理解，见微知著！<span id="more-80"></span></p>
<p>关于 swift 我们都是到是类型安全型的，相较于 OC ，安全似乎更能体现出来。关于这一方面， swift的可选型（optional）就不得不说了，可选型可以说是 swift 最为突出的特性之一。可能有的同学在看 swift 的过程中会遇到可选型（比如 <span style="color: #ff0000"><code>String?</code></span> ），有时也会见到<span style="color: #ff0000"> <code>String!</code> </span>这样的，搞不明白其中的意思，所以今天就来一步步理解可选型。</p>
<div>
<h4>一、什么是 Optional</h4>
<p>optional 是 swift 新加入的类型，所以学过 OC 的童鞋就知道在 OC 中是没有这个概念的。可选型的意思简单理解是：有值得时候就有值，无值的时候就是 nil 。swift 中的 nil 和其他语言中的 nil 还有些不一样，nil 自己本身就是一种类型，没有就是 nil ，是和其他类型严格区分开的。<br />
可选型的定义很简单：类型 + ? 。比如 <span style="color: #ff0000"><code>String?</code></span>、<span style="color: #ff0000"><code>Int?</code></span>、<span style="color: #ff0000"><code>Float?</code></span> 等，这里需要注意的是 <span style="color: #ff0000"><code>String?</code></span> 和 <span style="color: #ff0000"><code>String</code> </span>是完全不同的两个类型，前者是 <span style="color: #ff0000"><code>String</code></span> 类型的额可选型，后者是 <span style="color: #ff0000"><code>String</code></span> 类型，注意区分。举个例子，在 OC 中我们可以这样写</p>
<div>
<pre class="crayon-plain-tag">NSString *name = @"loveway";
 name = nil;</pre><br />
上面的这种写法在 OC 中是没有问题的，相比于上面，在 swift 中<br />
<pre class="crayon-plain-tag">var name: String = "loveway"
name = nil</pre><br />
如果我们像上面代码中这样写就会报错，如下</p>
<p><img class="alignnone size-full wp-image-81" src="http://www.newlifeclan.com/mobile/wp-content/uploads/sites/6/2016/08/571495-1af13cff33c0abd2.png" alt="571495-1af13cff33c0abd2" width="811" height="51" /></p>
<p>说的是 nil 是不可以分配给 String 类型的，这也说明在 swift 中 nil 是和其他类型严格区分的。改为可选型即可</p><pre class="crayon-plain-tag">var name: String? = "loveway"
name = nil</pre><p>可选型，顾名思义就是可以选择，比如<span style="color: #ff0000"> <code>String?</code></span> 的意思就是可以在 <span style="color: #ff0000"><code>String</code></span> 和<span style="color: #ff0000"> <code>nil</code></span> 之间选择，可以是 <span style="color: #ff0000"><code>String</code></span> 也可以是 <span style="color: #ff0000"><code>nil</code></span> 。如果一个变量定义成 <span style="color: #ff0000"><code>String</code></span>，那么这个变量就会是<span style="color: #ff0000"> <code>String</code> </span>类型，而不可能是<span style="color: #ff0000"><code>nil</code></span>。<br />
还有一点需要注意的是声明可选型必须是显示的声明也就是必须是</p><pre class="crayon-plain-tag">var name: String? = nil</pre><p>这样，而不能是</p><pre class="crayon-plain-tag">var name = nil</pre><p>这样，因为 swift 在做类型判断的时候无法判断 name 到底是 String 类型的可选型还是其他类型的可选型，因此会导致编译错误。</p>
<p>&nbsp;</p>
<h4>二、Optional的解包</h4>
<p>可选型是不能够被直接使用的（因为 swift 是类型安全的，可选型的值又可能会是 nil，如果不做处理可能导致程序 crash），如果我们想使用可选型的值，那么在这之前我们需要做的一项工作就是：解包（unwarp）！</p>
<p>1、强制解包<br />
所谓的强制解包意思就是我知道这个类型是可选型，但是在我的程序执行到这里的时候我可以保证它是有值得，所以我要在这里使用它。具体表现形式就是在可选型后面加个<span style="color: #ff0000"> <code>!</code></span>，如下</p><pre class="crayon-plain-tag">var name: String? = "loveway"
"My name is " + name!</pre><p>但是这样的解包是不安全，因为你不知道什么时候你的这个可选型就会变成 nil，如果我们代码非常多的话，一不小心为 nil了，可能会导致程序崩溃。这个时候我们会想到一种方法：判空！如下</p><pre class="crayon-plain-tag">var name: String? = "loveway"
if name != nil { 
 "My name is " + name!
} else {
  print("name is nil")
}</pre><p>这样写似乎是没有什么问题了，但是需要注意的是，你在判断非 nil 的作用域内使用 name 的时候还必须把<span style="color: #ff0000"> <code>!</code> </span>带上，这样代码比较多的时候还是比较麻烦。于是我们可以使用下面这种方式</p>
<p>&nbsp;</p>
<p>2、使用 <span style="color: #ff0000"><code>if let</code></span> 解包<br />
使用<span style="color: #ff0000"> <code>if let</code> </span>解包如下</p><pre class="crayon-plain-tag">var name: String? = "loveway"
if let name = name {
 "My name is " + name
} else {
  print("name is nil")
}</pre><p>这种解包方式可以保证 name 是解包过的，不会再是 nil 这种情况，其实逻辑是和上面做非空判断一样的。当然你把 <span style="color: #ff0000"><code>let</code> </span>换成 <span style="color: #ff0000"><code>var</code> </span>也是可以的，效果是一样的，只不过我们一般要用的是解包后的值，而不会去改变它，所以平常使用中一般都是用 <span style="color: #ff0000"><code>if let</code></span> 。<br />
同时 <span style="color: #ff0000"><code>if let</code></span> 可以同时一次性解包多个可选型，用<span style="color: #ff0000"> <code>,</code> </span>隔开，使语句简洁，如下</p><pre class="crayon-plain-tag">var name: String? = "loveway"
var age: Int? = 18
if let name = name, age = age {
 "My name is " + name
} else {
  print("name is nil")
}</pre><p>最后，既然这里使用的是<span style="color: #ff0000"> <code>if</code></span> ，那么同样我们可以如下这样用，来进行进一步的判断筛选</p><pre class="crayon-plain-tag">var name: String? = "loveway"
var age: Int? = 18
if let name = name, age = age where age == 18 {
  print("My name is \(name), age is \(String(age))")
} else {
  print("name is nil")
}</pre><p>&nbsp;</p>
<h4>三、可选链式调用（Optional Chaining）</h4>
<p>可选链式调用（Optional Chaining）是一种可以在当前值可能为 nil 的可选值上请求和调用属性、方法及下标的方法。如果可选值有值，那么调用就会成功，如果可选值是 nil ，那么调用将返回 nil。多个调用可以连接在一起形成一个调用链，如果其中任何一个节点为 nil ，整个调用链都会失败，即返回 nil 。<br />
下面我们就来举个例子具体说明可选链，如下</p><pre class="crayon-plain-tag">var name: String? = "loveway"
if let name = name {
    print(name.uppercaseString)
} else {
    print("name is nil")
}</pre><p>我们来解包 name ，如果有值就打印出 name 的大写，如果没有就输出<span style="color: #ff0000"> <code>name is nil</code> </span>，其实上面这段代码完全等同于</p><pre class="crayon-plain-tag">var name: String? = "loveway"
name?.uppercaseString</pre><p>上面这句代码的意思就是如果可选型变量 name 有值，那么就对 name 进行解包，并得到 name 的uppercaseString 值，如果没有，那么这句代码就会返回一个 nil 。这样就符合 swift 的类型安全，完全是没有问题的。但是如果你写成</p><pre class="crayon-plain-tag">var name: String? = "loveway"
name!.uppercaseString</pre><p>也是可以的，不过不安全，因为如果 name 没有值，你进行强制解包，就会报错。<br />
所以我们以后可能会用到类似于<span style="color: #ff0000"> <code>person?.name?.uppercaseString</code></span> 这样的一层层解包的，这种就是可选链。</p>
<p>&nbsp;</p>
<h4>四、Nil Coalescing Operator（空合运算符）</h4>
<p>如上，如果我们想把解包后的值存起来的话，可以这样</p><pre class="crayon-plain-tag">let newName = name == nil ? "no name" : name!</pre><p>上面代码的意思就是如果 name 为 nil ，newName 就是 &#8220;no name&#8221;，否则 newName 就是 name!（name的解包）。其实 swift 为我们提供了更简洁的语法，如下</p><pre class="crayon-plain-tag">let newName2 = name ?? "no name"</pre><p>上面代码的意思就是 name 如果有值 newName2 的值就是 name! ,否则就是 no name 。这里需要注意的是 <span style="color: #ff0000"><code>??</code></span>是空合运算符，这样写的可阅读性强，比较简洁。<br />
当然关于 <span style="color: #ff0000"><code>??</code> </span>远不止这些，有兴趣的同学可以看 <a href="http://www.jianshu.com/p/3ede1ec31351" target="_blank">聊聊swift语言中的“??”</a> 这篇文章。</p>
<p>&nbsp;</p>
<h4>五、隐式可选型</h4>
<p>上面我们都知道了，创建一个显示可选型是: 类型 + <span style="color: #ff0000"><code>?</code></span>。这里创建隐式可选型的就是： 类型 + <span style="color: #ff0000"><code>!</code></span>。</p><pre class="crayon-plain-tag">var name: String! = "loveway"</pre><p>这里可能有的童鞋会疑惑，已经有了显示的可选型，为什么还需要有隐式的可选型。这里其实隐式的可选型也是有一定作用的。比如你有一个变量，声明为隐式的可选型（<span style="color: #ff0000"><code>!</code></span>），它的作用就是，当你这个类没有被初始化的时候他是没有值的，但是当你这个类初始化以后，你可以确保他是有值的，所以这里声明为隐式的可选型，而不是显示的。同样需要注意的是隐式的可选型也是可选型，如果你需要用它的值，你也是要进行判断的。如果不进行判断而直接使用，可能会造成不可预料的后果！</p>
<p>参考链接：<a href="http://wiki.jikexueyuan.com/project/swift/chapter2/17_Optional_Chaining.html" target="_blank">可选链式调用（Optional Chaining）</a></p>
</div>
</div>
<p><a rel="nofollow" href="http://www.newlifeclan.com/mobile/archives/80">swift之Optional（可选型）</a>，首发于<a rel="nofollow" href="http://www.newlifeclan.com/mobile">移动技术</a>。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.newlifeclan.com/mobile/archives/80/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Storyboards的Selection Segue和Accessory Action</title>
		<link>http://www.newlifeclan.com/mobile/archives/22</link>
		<comments>http://www.newlifeclan.com/mobile/archives/22#comments</comments>
		<pubDate>Sun, 19 Jun 2016 04:36:57 +0000</pubDate>
		<dc:creator><![CDATA[napoleon]]></dc:creator>
				<category><![CDATA[IOS开发]]></category>

		<guid isPermaLink="false">http://www.newlifeclan.com/mobile/?p=22</guid>
		<description><![CDATA[<p>下面就是通过Segue将table view中的第一个cell和Single view关联起来，首先选中tab [&#8230;]</p>
<p><a rel="nofollow" href="http://www.newlifeclan.com/mobile/archives/22">Storyboards的Selection Segue和Accessory Action</a>，首发于<a rel="nofollow" href="http://www.newlifeclan.com/mobile">移动技术</a>。</p>
]]></description>
				<content:encoded><![CDATA[<p>下面就是通过Segue将table view中的第一个cell和Single view关联起来，首先选中table view中的第一个cell，然后control-drag到新添加的view，然后释放鼠标，这时会有一个弹出框弹出，<br />
<img class="alignnone size-full wp-image-23" src="http://www.newlifeclan.com/mobile/wp-content/uploads/sites/6/2016/06/aMNrIv.png" alt="aMNrIv" width="136" height="134" /><br />
这个弹出框有2部分组成，Selection Segue和Accessory Action，这2部分的选项是相同的。<br />
<strong>Selection Segue</strong>的意思是当用户点击table view cell的任何部分，都会产生反应。<br />
<strong>Accessory Action</strong>的意思是只有当用户点击table view cell右边的圆圈箭头按钮时，才会产生的反应。</p>
<p><a rel="nofollow" href="http://www.newlifeclan.com/mobile/archives/22">Storyboards的Selection Segue和Accessory Action</a>，首发于<a rel="nofollow" href="http://www.newlifeclan.com/mobile">移动技术</a>。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.newlifeclan.com/mobile/archives/22/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
