swift_010(Swift 的可选类型)

2023-12-03 20:58
文章标签 类型 swift 010 可选

本文主要是介绍swift_010(Swift 的可选类型),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

//***********swift--1.3--可选类型--***************************


// (Optionals)即在某个数据类型后面加上问号(?)或感叹号(!

// IntString类型不能接受nil的,但程序运行过程中有时被复制给nil是在所难免的,Swift为每一种数据类型提供一种可选类型(optional),即在某个数据类型后面加上问号(?)或感叹号(!

var nn1: Int? = 10; nn1 = nil

let str22: String! = nil


// Swift 的可选(Optional)类型,用于处理值缺失的情况。可选表示"那儿有一个值,并且它等于 x "或者"那儿没有值"


// 可选类型值拆包:在可选类型的问号(?)或叹号(!)究竟有什么区别呢?这与可选类型的拆包unwrapping)有关,拆包是将可选类型变成普通类型,如果我们直接打印非空的可选类型值,代码如下:


var n1: Int? = 10

print(n1)

// print(n1 + 100)

// 输出的结果是Optional(10),而非10。所以试图计算表达式n1 + 100会发生编译错误,代码如下:


var n2: Int? = 10

// print(n2 + 100) //发生编译错误


// 需要对可选类型值进行拆包是必要地。

// “拆包分为显示拆包和隐性拆包。


// 使用问号(?)声明的可选类型,在拆包时需要使用叹号(!),这种拆包方式称为显式拆包

// 使用叹号(!)声明的可选类型,在拆包时可以不使用叹号(!),这种表示方式称为隐式拆包



// Swfit语言定义后缀?作为命名类型Optional的简写,换句话说,以下两种声明是相等的:

var optionalInteger: Int?

var optionalInteger1:Optional<Int>


// 在这两种情况下,变量optionalInteger都是可选整数类型。注意,在类型和?之间没有空格。

// Optional 是一个含有两种情况的枚举,NoneSome(T),用来表示可能有或可能没有值。任何类型都可以明确声明为(或者隐式转换)可选类型。

// 当声明一个可选类型的时候,要确保用括号给?操作符一个合适的范围。例如,声明可选整数数组,应该写成(Int[])?;写成Int[]?会报错


// 当你声明一个可选变量或者可选属性的时候没有提供初始值,它的值会默认为nil


// 可选项遵照LogicValue协议,因此可以出现在布尔环境中。在这种情况下,如果可选类型T?包含类型为T的任何值(也就是说它的值是Optional.Some(T)),这个可选类型等于true,反之为false

// 如果一个可选类型的实例包含一个值,你可以用后缀操作符 !来访问这个值,如下所示:


optionalInteger = 43

optionalInteger! // 43


// 使用操作符!去获取值为nil的可选变量会有运行时错误。

// 我们可以用可选链接和可选绑定选择性执行可选表达式上的操作。如果值为nil,任何操作都不会执行,也不会有运行报错。

var optiongString:String? = nil


if (optiongString != nil) {

    print(optiongString)

} else  {

    print("字符串为 nil")

}

// 可选类型类似于Objective-C中指针的nil值,但是nil只对类(class)有用,而可选类型对所有的类型都可用,并且更安全。


//***********swift--1.3.1--强制解包--***************************


// 当你确定可选类型确实包含值之后,你可以在可选变量+!来获取值。这个!表示"我知道这个可选变量有值,请使用它",这被称为可选值的强制解析(forced unwrapping)。

// 注意:使用!来获取一个不存在的可选值会导致运行时错误。使用!来强制解析值之前,一定要确定可选包含一个非nil的值。


var unwarppingString:String?

unwarppingString = "unwarppingString!"


print(unwarppingString!)



//***********swift--1.3.2--自定解包--***************************

// 你可以在声明可选变量时使用感叹号(!)替换问号(?)。这样可选变量在使用时就不需要再加一个感叹号(!)来获取值,它会自动解析。


var autoWarppingString:String!

autoWarppingString = "autoWarppingString!"


print(autoWarppingString)



//***********swift--1.3.3--可选绑定--***************************

// 使用可选绑定(optional binding)来判断可选类型是否包含值,如果包含就把值赋给一个临时常量或者变量。可选绑定可以用在ifwhile语句中来对可选类型的值进行判断并把值赋给一个常量或者变量。


var optionBindString:String?


//optionBindString = "optionBindString!"


if let yourBindString = optionBindString {

    print("你的字符串值为 - \(yourBindString)")

}else{

    print("你的字符串没有值")

}




// 思考:  swift  optiongal 有什么用?

// 1.Bool? 类型可以又三种值, true | false | nil 可以表示三种状态。比如在网络返回时用 nil 表示网络请求失败,true 表示成功, false 表示 server 收到数据,但是处理结果是错误。通过一种类型,把三种情况区别出来,增加了语言的抽象能力。


var result: Bool?

// 如果你真的想要 false 等同于 nil 的效果,我觉得那种情况里,多半应该这么写:

//if result == true {

//    

//}

result = true

if result != nil {

    if result==true {

        print("result == true")

    } else {

        print("result == false")

    }

} else {

     print("result == nil")

}



// 2.函数/字典的参数值 value 可以为nil (与oc不同)


func testObject(object:AnyObject?, forKey:String?) {

}

testObject(object: optionBindString as AnyObject?, forKey: "test");


let tsetDict :Dictionary<String,AnyObject?>= ["key1":"value1" as AnyObject?,"key2":optionBindString as AnyObject?]


print("******tsetDict********\(tsetDict)")


// 3.一定要使用正常的可选类型。

// 注:如果一个可选类型存在没有值的可能的话,不应该使用解包(隐式)可选类型。这种情况下,一定要使用正常的可选类型。

// 这句话我个人是这样理解的,如var view:UIView。当我的整个应用中或整个类中不可能存在view = nil的情况时可以设置为var view:UIView! 否则就可声明为var view:UIView?


/*

 之前一直对option的概念很感兴趣,苹果公司用option来包括一切,任何语言都会因为数据的匹配读取为空或者不匹配而产生一系列的问题,很显然,苹果公司有想利用option来弥补这种漏洞的野心。

 option真正是什么,如果他包裹了一个数据,那么他如果其实真正是什么他就不会去关心,而是很完整的告诉下一个执行,哦,我给你的是一个option的类型,具体的话,你自己想要知道,就自己去看。

 网上已经有很多option的讲解,option其实是一个结构体,一个有nilset组成的结构体,如果没有值的时候,就会给nil,如果有值,就会把值附载在set上,传给需要调用的数据。

 解包 (!) 是一个很有意思的想法,如果有了option来包裹,做真正安全的数据类型,为什么还要解包,因为要用里面的值,但是注意必须要有值可用才可以

 很简单的来说,swift创造了一种不会出错的安全数据类型来承接很多我们未知的数据,这样可以避免一些数据问题。也统一处理了数据上的差异。 

 */


这篇关于swift_010(Swift 的可选类型)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/450843

相关文章

Spring Boot 配置文件之类型、加载顺序与最佳实践记录

《SpringBoot配置文件之类型、加载顺序与最佳实践记录》SpringBoot的配置文件是灵活且强大的工具,通过合理的配置管理,可以让应用开发和部署更加高效,无论是简单的属性配置,还是复杂... 目录Spring Boot 配置文件详解一、Spring Boot 配置文件类型1.1 applicatio

Python如何查看数据的类型

《Python如何查看数据的类型》:本文主要介绍Python如何查看数据的类型方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录python查看数据的类型1. 使用 type()2. 使用 isinstance()3. 检查对象的 __class__ 属性4.

Python容器类型之列表/字典/元组/集合方式

《Python容器类型之列表/字典/元组/集合方式》:本文主要介绍Python容器类型之列表/字典/元组/集合方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 列表(List) - 有序可变序列1.1 基本特性1.2 核心操作1.3 应用场景2. 字典(D

Python如何在Word中生成多种不同类型的图表

《Python如何在Word中生成多种不同类型的图表》Word文档中插入图表不仅能直观呈现数据,还能提升文档的可读性和专业性,本文将介绍如何使用Python在Word文档中创建和自定义各种图表,需要的... 目录在Word中创建柱形图在Word中创建条形图在Word中创建折线图在Word中创建饼图在Word

SpringBoot接收JSON类型的参数方式

《SpringBoot接收JSON类型的参数方式》:本文主要介绍SpringBoot接收JSON类型的参数方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、jsON二、代码准备三、Apifox操作总结一、JSON在学习前端技术时,我们有讲到过JSON,而在

Rust中的BoxT之堆上的数据与递归类型详解

《Rust中的BoxT之堆上的数据与递归类型详解》本文介绍了Rust中的BoxT类型,包括其在堆与栈之间的内存分配,性能优势,以及如何利用BoxT来实现递归类型和处理大小未知类型,通过BoxT,Rus... 目录1. Box<T> 的基础知识1.1 堆与栈的分工1.2 性能优势2.1 递归类型的问题2.2

Python如何计算两个不同类型列表的相似度

《Python如何计算两个不同类型列表的相似度》在编程中,经常需要比较两个列表的相似度,尤其是当这两个列表包含不同类型的元素时,下面小编就来讲讲如何使用Python计算两个不同类型列表的相似度吧... 目录摘要引言数字类型相似度欧几里得距离曼哈顿距离字符串类型相似度Levenshtein距离Jaccard相

Go语言中三种容器类型的数据结构详解

《Go语言中三种容器类型的数据结构详解》在Go语言中,有三种主要的容器类型用于存储和操作集合数据:本文主要介绍三者的使用与区别,感兴趣的小伙伴可以跟随小编一起学习一下... 目录基本概念1. 数组(Array)2. 切片(Slice)3. 映射(Map)对比总结注意事项基本概念在 Go 语言中,有三种主要

Redis的Zset类型及相关命令详细讲解

《Redis的Zset类型及相关命令详细讲解》:本文主要介绍Redis的Zset类型及相关命令的相关资料,有序集合Zset是一种Redis数据结构,它类似于集合Set,但每个元素都有一个关联的分数... 目录Zset简介ZADDZCARDZCOUNTZRANGEZREVRANGEZRANGEBYSCOREZ

IDEA如何将String类型转json格式

《IDEA如何将String类型转json格式》在Java中,字符串字面量中的转义字符会被自动转换,但通过网络获取的字符串可能不会自动转换,为了解决IDEA无法识别JSON字符串的问题,可以在本地对字... 目录问题描述问题原因解决方案总结问题描述最近做项目需要使用Ai生成json,可生成String类型