Swift学习-----可选类型

可选类型
* 可选类型表示变量可以有值, 也可以没有值
* C 和 Objective-C 中并没有可选类型这个概念
* Swift中只有可选类型才可以赋值为nil
* 如果你声明一个可选常量或者变量但是没有赋值,它们会自动被设置为nil

* 格式: Optional<类型>  或 在类型后面加上?号

可选类型的取值是一个枚举
* None 没有值
* Some 有值

* 由于可选类型在Swift中随处可见, 所以系统做了一个语法糖, 在类型后面加上?
注意:
* nil不能用于非可选的常量和变量。如果你的代码中有常量或者变量需要处理值缺失的情况,请把它们声明成对应的可选类型。
* Swift 的nil和 Objective-C 中的nil并不一样。在 Objective-C 中,nil是一个指向不存在对象的指针, 所以Objective-C只有对象类型才能被设置为nil(基本类型不行)。在 Swift 中,nil不是指针——它是一个确定的值,用来表示值缺失。任何类型的可选状态都可以被设置为nil,不只是对象类型。

var number: Optional<Int>

number = 10

number = nil

var number1: Int

number1 = 10

//number1 = nil

// 推荐

var number2: Double?

number2 = 20.1

//number2 = nil

// Swift中可选类型的值不能当做普通类型的值来使用

// 如果想使用可选类型的值必须进行解包操作

// 只需要在变量/常量后面加上! 就可以解包

// 解包代表着告诉系统, 该变量/常量中一定有值

var number3: Double

number3 = 3.14

print(number2)

print(number2!)

print(number3)

let sum = number2! + number3

强制解析(forced unwrapping)
* init? 构造函数, ?表示不一定能够实例化出对象
* !表示告诉编译器一定有值, 编译能够通过, 如果运行时没有值就会直接崩溃
* 提示: ? 和 ! 是所有刚刚接触Swift的OC程序员最最蛋疼的问题, 前期开发要注意多看文档和利用编译器提示解决(option + click)
注意
* 在Swift开发中, 尽量不要使用强制解包, 不安全
let url = NSURL(string: "http://www.520it.com")
print(url)
//print(url!)
let url1 = NSURL(string: "http://www.520it.com/图片/abc.png")
print(url1)
可选绑定(optional binding)
* 不需要考虑url是否有值, 能进入{}一定有值
* 不仅可以用来判断可选类型中是否有值,同时可以将可选类型中的值赋给一个常量或者变量
* 可选绑定可以用在if和while语句中

提示:
* 在实际开发中,使用频率很高

注意:
* 可选绑定中的变量/常量只能在if后面的{}中使用
if let temp = url {
    print(temp)
}

let value1: Int? = 10
let value2: Int? = 20
let value3: Int? = 30
let value4: Int? = 40

if let temp1 = value1 {
    if let temp2 = value2 {
        if let temp3 = value3 {
            if let temp4 = value4 {
                let sum = temp1 + temp2 + temp3 + temp4
            }
        }
    }
}
guard
* guard语句是在Swift 2.0中引进的,它是用途是在未满足某个条件时,提供一个退出的路径
* 格式: guard 表达式 else{}
注意:
* guard中的变量/常量 可以在guard后面使用
* guard一般用于避免使用强制拆包, 优化代码结构
func test(){
    let value1: Int? = 10
    let value2: Int? = 20
    let value3: Int? = 30
    let value4: Int? = 40

    guard let temp1 = value1 else{
        return
    }
    guard let temp2 = value2 else{
        return
    }
    guard let temp3 = value3 else{
        return
    }
    guard let temp4 = value4 else{
        return
    }
    let sum = temp1 + temp2 + temp3 + temp4
    print(sum)
}
test()
隐式解析可选类型(implicitly unwrapped optionals)
* 有时候在程序架构中,第一次被赋值之后,可以确定一个可选类型_总会_有值。在这种情况下,每次都要判断和解析可选值是非常低效的,因为可以确定它总会有值
* 隐式解析可选类型, 并不需要每次都使用解析来获取可选值, 一个隐式解析可选类型其实就是一个普通类型,但是可以被当做非可选类型来使用
* 格式: 将可选类型后面的?改为!
* let xmgButton: UIButton!

注意:
* 如果一个变量之后可能变成nil的话请不要使用隐式解析可选类型。如果你需要在变量的生命周期中判断是否是nil的话,请使用普通可选类型

let intValue: Int?
intValue = 10
print(intValue)
print(intValue!)

if intValue != nil {
    print(intValue!)
}

if let temp = intValue {
    print(temp)
}

var doubleValue: Double!
doubleValue = nil
doubleValue = 3.14
print(doubleValue)
时间: 2024-10-06 00:40:52

Swift学习-----可选类型的相关文章

Swift:可选类型(Optional)

在我们使用objective-c表示字符串信息的时候,可以用下面方法书写. NSString *str = @"秋恨雪"; str = nil; 因为objective-c是弱类型语言,所以这里的str既可以是具体的字符串也可以是nil.但到了Swift中就不可以了,因为Swift是类型安全的语言,一个String类型的变量不可能既能是具体的字符串,又可以为nil(更严格的说String类型的内容只能是字符串).所以,在Swift中有了可选类型的概念.(其实这一概念也是"借鉴

swift语言-可选类型

可选类型 什么是可选类型 可选值类型的数据有两种可能:有值.没有值(nil).注意需要在变量类型后面加问号(?).如果是Int加问号(?),则变量的为Int?型的.问号(?)是可选类型的标志. 可选值可以使用if判断有没有值 #import Foundation var optValue: Int? = nil if optValue != nil{ println("not nil") }else{ println("nil") } 如何获得可选值里的值? 强制解

Swift中可选类型(Optional)的用法 以及? 和 ! 的区别 (转载博客,知识分享)

本文转载自:代码手工艺人的博客,原文名称:Swift之 ? 和 ! Swift语言使用var定义变量,但和别的语言不同,Swift里不会自动给变量赋初始值,也就是说变量不会有默认值,所以要求使用变量之前必须要对其初始化.如果在使用变量之前不进行初始化就会报错: C代码   var stringValue : String //error: variable 'stringValue' used before being initialized //let hashValue = stringVa

Swift学习—元组类型

知识点: 元组数据中的元素可以有名称也可以没有名称 元组数据中的元素可以为空 元素访问可以通过元素名称或者下标 声明成var的元组数据中的元素可以被改变 可以指定元素的类型(在明确指出元素类型的情况下不能加上元素的名称) 可以用多个变量接收元组数据 可以将元素分别赋值给多个变量 可以用下划线_忽略某个元素的值,从而取出其他的元素 示例代码: //: Playground - noun: a place where people can play import UIKit // 元组类型由N个任意

Swift学习笔记 - 可选 ?

可选类型 使用可选类型(optionals)来处理值可能缺失的情况.可选类型表示: 有值,等于 x 或者 没有值 注意:C 和 Objective-C 中并没有可选类型这个概念.最接近的是 Objective-C 中的一个特性,一个方法要不返回一个对象要不返回nil,nil表示“缺少一个合法的对象”.然而,这只对对象起作用——对于结构体,基本的 C 类型或者枚举类型不起作用.对于这些类型,Objective-C 方法一般会返回一个特殊值(比如NSNotFound)来暗示值缺失.这种方法假设方法的

[iOS] Swift 初学手册:可选类型 (Optionals)

原文地址:http://blog.callmewhy.com/2014/09/23/beginners-guide-optionals-swift/ 几周前 (译者注:原文发表于6月24日),苹果发布了一个全新的编程语言: Swift .从那时起,我一直在阅读Swift 官方手册,并且在 Xcode6 beta 上把玩学习.我开始喜欢上了 Swift 的简洁和语法.我和我的团队一起学习这门全新的语言,并且将它和 Objective-C 这个有着30年历史的老伙计进行对比.同时,我们也在努力探索如

Swift 学习- 02 -- 基础部分2

class NamedShape{ var numberOfSides: Int = 0 var name: String init(name: String) { self.name = name } func simpleDecription() -> String { return "A shape with \(numberOfSides) \(name) sides" } } // 除了储存简单的属性之外,属性可以有 getter 和 setter class Equi

初探swift语言的学习笔记(可选类型?和隐式可选类型!)

可选类型.隐式可选类型 其次swift还引入一个较有趣的初始值设置语法使用"?"操作符及"!"号操作符 如:"var optionalString: String? = "Hello" optionalString == nil var optionalName: String? = "John Appleseed" var greeting = "Hello!" if let name = op

菜鸡的swift学习(1):Mac中语言设定,no such module Cocoa的,可选类型的声明

Mac中语言的设定: no such module Cocoa:在试一下swift的教程学习的代码的时候 发现import Cocoa导入这个包的时候一直报错 因为我新建的是playground的工程,所以应该导入UIkit包这样就可以解决这个错误 Cocoa这个包是在IOS开发中使用的包 可选类型的声明时 var myString:String ?= nil 注意空格 原因是我没有注意到'?'和空格的位置 修正为 var myString:String? = nil String?中间是没有空