重新认识Swift中的可选型(Swift2.1)

//: Playground - noun: a place where people can play

import UIKit

/*
Swift中nil代表是是另外一种类型, 而不像OC那样, 任何对象都能赋值为nil,
Swift中的nil就是空, 什么都没有的意思, 当一个变量有可能存在空值的时候, 必须显式的申明为可选型,
否则不能直接赋值为nil, 因为无论是Int, String还是其他的类型, 都和nil不是同一种类型,
道理就跟将一个Int类型赋值给一个String类型的变量一样, 是行不通的!
所以, 要想一个变量可以赋值为nil, 就必须显式申明为可选型, 也就是在类型后面加上"?"
下面直接代码演示...
*/

// let errorCode = nil  这行代码会报错, 因为Swift不能自动识别这个到底是什么类型的可选型
// let errorCode: String = nil  这行代码会报错, 因为nil和errorCode不是同一种类型(String)

// 这样才是正确的代码
var errorCode: String? = nil;

// 一个可选型可以复制一个同类型的非可选型(或可选型)的值, 例如这里404是一个String类型, 而不是String?类型
errorCode = "404"
// 但是不能直接将一个可选值赋值给同类非可选型变量
// let errorCode2: String = errorCode   // 这行代码会报错
// 要想将一个可选值赋值给非可选型变量, 就需要对可选值进行解包操作

// 1.强制解包, 存在一定的风险, 例如errorCode为nil的时候, 会出现异常, 一般只使用在确定一个可选值一定为非nil的时候使用
var errorCode2: String = errorCode!
// 2.if-let解包
if let errorCode = errorCode {      // 只有errorCode非nil, 才会执行
    errorCode2 = errorCode;
} else {                            // 否则就执行这里
    print("errorCode为nil")
}

// 另外还可以一次对多个可选值进行解包
let errorMessage: String? = "Not Found"
if let errorCode = errorCode, errorMessage = errorMessage {
    print("Error Code is \(errorCode), Error Message is \(errorMessage).")
}

  

时间: 2024-09-27 18:20:34

重新认识Swift中的可选型(Swift2.1)的相关文章

Swift 中枚举

Swift 中枚举高级用法及实践 字数11017 阅读479 评论0 喜欢20 title: "Swift 中枚举高级用法及实践"date: 2015-11-20tags: [APPVENTURE]categories: [Swift 进阶]permalink: advanced-practical-enum-examples 原文链接=http://appventure.me/2015/10/17/advanced-practical-enum-examples/作者=Benedik

swift 中Value Type VS Class Type

ios 中Value Type 和 Class Type 有哪些异同点,这个问题是在微信的公共帐号中看到的,觉得挺有意思,这里梳理一下. 1.swift 中为什么要设置值类型? 值类型在参数传递.赋值的过程中采用的是Copy的过程,copy的"值"是该值所在的内存块,相比于class类型,copy更直接,没有对象中方法调用(饮用计数.copy方法等),因此效率更高.猜测swift引入的值类型主要是为了提高效率. 2.swift 存在哪些值类型 swift中常见的值类型有 struct,

如何在Swift中使用NSError

步骤一:声明NSError变量.一定要加"?",不加或者加"!"都不行.因为使用了optional,所以要用var而不用let. var error: NSError? 步骤二:使用的时候在变量前加上"&". NSJSONSerialization.JSONObjectWithData(data!, options: .MutableContainers, error: &error) 之前遇到的坑是NSError使用的是&quo

Swift中NSDictionaryOfVariableBindings的替代方案

有日子没写东西了,抽点时间练练笔头子,业精于勤荒于嬉~ 近期从OC转到了Swift2,因为Swift一直没有正经学正经用,所以对这门语言的理解基本算是个球...不得不感慨苹果的动作之快.Swift还没学呢.就2了.. .于是意识到再不学起来可能就真2了~~花了些时间看了全本的<The Swift Programming Language>总算是能用他写点东西了~跟着问题就出来了 习惯了手写自己主动布局,还是那句老话,缩写是SB(StoryBoard)的东西能好用到哪去~~可也正由于这个遇到了一

Swift 中的Range和NSRange不同

Swift中的Ranges和Objective-C中的NSRange有很大的不同,我发现在处理Swift中Ranges相关的问题的时候,总是要花费比我想象的更多的时间.不过,现在回过头来看看,发现Swift中的Ranges的使用还是比较合理的,但是想要正确的使用Ranges真的需要一些特别的技巧. 看一个例子,下面这段代码展示的是截取以指定的字符开头和以指定的字符结尾的子字符串: ? 1 2 3 4 5 6 var str = "Hello, playground"   let ran

Swift 中的基础语法(二)

1.Swift 中的函数 /// 函数的定义 /// /// - Parameters: /// - x: 形参 /// - y: 形参 /// - Returns: 返回值 func sum(x: Int, y: Int) -> Int { return x + y } print(sum(x: 10, y: 20))   /* 外部参数就是在形参前面加了一个字 外部参数不会影响函数内部的细节 外部参数会让外部调用看起来更加直观 外部参数如果使用了'_',在外部调用函数时,会忽略形参的名字 &qu

Swift中的错误处理

前言 任何代码都会发生错误,这些错误有些是可以补救的,有些则只能让程序崩溃.良好的错误处理能够让你的代码健壮性提高,提高程序的稳定性. 本文的Swift版本:Swift 3 Objective C 返回nil 如果出错了,就返回空是Objective C中的一种常见的处理方式.因为在Objective C中,向nil发送消息是安全的.比如: - (instancetype)init { self = [super init]; if (self) { } //如果初始化失败,会返回nil ret

swift中代理的使用

下面以自定义的UITableViewCell的代理为例,记录一下swift中代理的使用 controller中的代码如 1 // 2 // ViewController.swift 3 // simpleDemo 4 // 5 // Created by liubo on 16/7/25. 6 // Copyright © 2016年 liubo. All rights reserved. 7 // 8 9 import UIKit 10 11 class ViewController: UIV

SWIFT中的repeat...while

SWIFT中的repeat...while类似于JAVA\.NET中的 do while.大同小异只是把do换成了repeat var index = 10 repeat{ print(index) index-- } while(index>0)