Swift-20-基础数据类型

数据定义

语法规则

先来看下下面的代码

import Cocoavar num1 = "four" //a
var num2: String = "four" //b
var num3 = 4       //c
var num4: Int = 4  //d

上面的几行代码都能正常运行,其中a和b行等价,c和d行等价。区另就在于是否声明了类型,虽说swift会根据值的类型来推断其变量的类型,保证程序运行不会出现,但还是建议以b和d行的写法为准,因为可读性比较强也会避免很潜在的bug。

可简单理解为swift的类型是一种兼容弱和强类型的一种语法格式,在实际使用中强烈建议采用强类型来定义;

数据类型

在Swift中数据分为常量和变量两种,分别会使用不同的关键字来修饰:

  • var:用于定义变量,即值可被改变;
  • let:用于定义常量,即值一旦初始化后就不允许改变;
//用let定义常量,值不能被改变
let numberOfStoplights: Int = 4
let townName: String = "Londo"//用var定义变量,值可以被改变
var population: Int = population = 5422//采用\(varName)的方式来引用变量
let townDescription ="\(townName) has a population of \(population) and \(numberOfStoplights) stoplights."//值打印到Console控制台上
print(townDescription)

代码注释

有两种注释方法:

  1. 单行注释://
  2. 多行注释:/* */或 /** /
//我是单行行注释,不能换行写哟/**
如果有多行注释要写,可以用这种方式*/

带标题的注释,用MARK:分隔,但只能用于行注释不能用于块注释

// MARK: Extend Velocity to suport converting
// I.e., there is a problem with the interchangeability of Velocity for Double

在这里插入图片描述

基础数据类型

Character

Swift 的字符是一个单一的字符字符串字面量,数据类型为 Character。

import Cocoalet char1: Character = "A"
let char2: Character = "B"print("char1 的值为 \(char1)")
print("char2 的值为 \(char2)")//~~char1 的值为 A
//~~char2 的值为 B

Swift 中不能创建空的 Character(字符) 类型变量或常量:

import Cocoa// Swift 中以下赋值会报错
let char1: Character = ""
var char2: Character = ""print("char1 的值为 \(char1)")
print("char2 的值为 \(char2)")
//~~ error: cannot convert value of type 'String' to specified type 'Character'

布尔

布尔值字面量有三个值,它们是 Swift 的保留关键字:

  • true 表示真。
  • false 表示假。
  • nil 表示没有值。
let aBool = true        //布尔值字面量
let a:Bool = true

字符串

组成Swift字符串底层实现为集合形式,由多个Character类型的单个字符组成。

声明

在swift中字符串不分可变和不可变,可变的特性全部接由var和let来限定。

//以下两种声明方式是等价的
var errorString: String = "The request failed:"
var errorString = "Hello, playground"
var errorString += "!"//计算长度
print(playground.count)

unicode声明,标准语法格式为: \u{}。值为十六进制的数。

let oneCoolDude = "\u{1F60E}"
let aAcute = "\u{0061}\u{0301}"

在这里插入图片描述

遍历

//逐个字母打印
let playground = "Hello, playground"
for scalar in playground.unicodeScalars {print("\(scalar) ")//print("\(scalar.description) ") //与上面代码等价//print("\(scalar.value) ")
}

在这里插入图片描述

索引与区间

这些方法比较特殊,需要额外记一下。

let playground = "Hello, playground"
let start = playground.startIndex
let end = playground.index(start, offsetBy: 4)
let fifthCharacter = playground[end]
let range = start...end
let firstFive = playground[range]

在这里插入图片描述

  • .startIndex:获取字符串的第一个索引,实际值是0;
  • .index(start, offsetBy: 4):取得从start往前数4个字符,即第5个字符,返回的一个索引值,实际值为5;
  • []:返回索引或索引区间指定的字符或字符串,此处返回hello中的o;最后一行代码返回的是hello;
  • range:表示区间,在本例中实际值为0~5;

下面是更复杂一点的区间的例子

let playground = "Hello, playground"
let start = playground.startIndex
let end = playground.index(start, offsetBy: 4)let s1 = playground[start...] //Hello, playground
let s2 = playground[..<end] //Hell
let s3 = playground[start..<end] //Hell

整数

在Mac OS中,整形大小不固定,其会根据关键字来区分,比如在swift中整形可定义为:Int、Int8、Int16、Int32和Int64这几种,其中Int==Int64。

另外还有无符号数,UInt、UInt8、UInt16、UInt32和Int64这几种,即其值只能为正数。
在这里插入图片描述

var age: Int8 = 98print("The maximum Int value is \(Int.max)")
print("The minimum Int value is \(Int.min)")
print("The maximum value for a 32-bit integer is \(Int32.max).")
print("The minimum value for a 32-bit integer is \(Int32.min).")print("The maximum UInt value is \(UInt.max).")
print("The minimum UInt value is \(UInt.min).")/*
The maximum Int value is 9223372036854775807
The minimum Int value is -9223372036854775808
The maximum value for a 32-bit integer is 2147483647.
The minimum value for a 32-bit integer is -2147483648.
The maximum UInt value is 18446744073709551615.
The minimum UInt value is 0.
*/

溢出操作

在swift中,整数都有一个范围,默认时就超出范围时就会报错,比如Int8最大值是-128~127之间,那么下面的代码就会有问题:

var overflow: Int8 = 120
overflow = overflow + 50

在这里插入图片描述

由于溢出中断了,如果想保证上面的程序能正常运行,则可以使用&关键字

var overflow: Int8 = 120
overflow = overflow &+ 8 //-128

注意这种溢出的值是从最小值折返着算,即Int8最大值为127,所以128会从最小值开始算为-128, 129则为-127。这一点比较有争议,但其实很多语言全是这样处理的。

这种溢出操作如无需要尽量不要使用,把所有的整数全定义为Int即可。

类型转换

在swift中不存在自动升级的情况,需要手工转换,比如下面的代码会出问题

var i16: Int16 = 32
var i8: Int8 = 2var sum: Int16 = i16 + i8

可做如下修正

var i16: Int16 = 32
var i8: Int8 = 2//只能类型相同
var sum: Int16 = i16 + Int16(i8)
//下面这行也会报错
var sum: Int32 = i16 + Int16(i8)

浮点数

在swift中有两种浮点数:Float表示32位,Double表示64位,区别在于精度高低。但同整数一样也会有Float32这样的类型。

let d2: Double = 1.1
let f1: Float = 100.3
print(10.0 + 11.4) //21.4
print(11.0 / 3.0) //3.6666666666666665,默认16位小数位
var d3: Double = d2 + Double(f1) //101.4000030517578

关于浮点数据的特殊说明:

  • 浮点数天生就是不精确的,所以不能用于科学计算;
  • 浮点数不能用==来比较;
  • 也会存在类型转换的问题;

精准度测试

let d11 = 1.1
let d22: Double = 1.1if d11 == d22 { //TRUE,打印print("d1 and d2 are the same!")
}print("d11 + 0.1 is \(d11 + 0.1)") //1.2000000000000002
if d11 + 0.1 == 1.2 { //FALSE,不会打印print("d1 plus 0.1 is equal to 1.2")
}

可空类型

可空类型(optional)是Swift的独特特性,用来指定某个实例可能没有值,如果一个实例没有值,也可称其为nil。任何类型都可以用可空类型来说明一个实例可能是nil,这和java的null有点类似。

本节主要讲述如何声明可空类型,如何使用可空实例绑定(optional binding)来检查某个可空实例是否为nil并且在有值的情况下使用其值,以及如何使用可空链式调用(optional chaining)来查询一连串可空值。

Swift为何要设计可空类型?Swift 设计可空类型的原因是为了处理缺失的值。在没有指定某个值可能为空的情况下,尝试访问这个值会导致运行时错误。通过使用可空类型(Optional),Swift 提供了一种安全的方式来处理可能缺失的值。可空类型在 Swift 中表现为一个抽象的类型 Optional,它有两个主要的类型 Optional.Some 和 Optional.None。当你声明一个变量为可空类型时,它可能包含一个具体的值,也可能为空(nil)。这样可以避免空指针异常等常见的运行时错误。确保了在编译时就能捕获潜在的空值问题,而不是等到运行时才崩溃。这有助于写出更加健壮和安全的代码。

例如,以下是一个可空类型的声明和使用

不可自动展开声明,关键字 ?

语法格式:var/let varName: varType? //关键字 ?


var errorCodeString: String?  //这行的值为nilerrorCodeString = "hello"    
print("\(errorCodeString)") //~~ Optional("404")

上面打印可空字符串时会在值外面套一个Optional("),现在可以用!来恢复正常输出,术语称为强制展开,强制展开会访问空实例封装的值。

var errorCodeString: String?
errorCodeString = "404"
print("\(errorCodeString)") //Optional("404")if(errorCodeString != nil){print(errorCodeString!) //~~ 404
}

但需要注意,要强制展开一个空实例时,程序会出错异常,这也是上在的代码为何要加一个if的原因,比如下面这行代码就会报:Fatal error: Unexpectedly found nil while unwrapping an Optional value 异常。

var errorCodeString: String?
print("\(errorCodeString!)")

可自动展开声明,关键字 !

功能同用?声明的差不多,唯一的区别就是在展开时不需要写if判断语句了,其实的特性基本一样。

  • 在有值时,与?作用相同
var errorCodeString: String!
print(errorCodeString) //输出nilerrorCodeString = "404"
print(errorCodeString) //输出Optional("404")
print(errorCodeString!) //输出404//下面这两行代码,在errorCodeString不等于nil时作用相同
let anotherErrorCodeString: String = errorCodeString! //404
let yetAnotherErrorCodeString = errorCodeString //404
  • 在值为nil时,则有一种写法就可以带来便利
var errorCodeString1: String!let anotherErrorCodeString3 = errorCodeString1 //nil,正常
let anotherErrorCodeString4 = errorCodeString1!//异常let anotherErrorCodeString1: String = errorCodeString1! //异常
let anotherErrorCodeString2: String = errorCodeString1 //异常

可空实例绑定

可空绑定,用于判断空实例用,如果非nil就将其赋给一个临时常量或变量,并且使这个常量或变量在条件语句的第一个分支代码中可用。

var errorCodeString: String?//因为errorCodeString=nil所以此处不成立,不走print打印
if let theError = errorCodeString { print("\(theError): \(errorCodeString)")
}//这段代码和上面的代码等价
//if nil = errorCodeString {
//    let theError =errorCodeString
//    print("\(theError): \(theError)")
//}//给theError赋值404,然后再进行运算,此处代码成立会打印print
errorCodeString = "404"
if let theError = errorCodeString { if let errorCodeInteger = Int(theError) {print("\(theError): \(errorCodeInteger)")}
}

上面这种多个if的写法会比较麻烦,可以简写成以下的样子

var errorDescription: String?if let theError = errorCodeString, let errorCodeInteger = Int(theError){print("\(theError): \(errorCodeInteger)")
}

可空链式调用

可空链式调用提供了一种对可空实例进行查询以判断其是否包含值的机制。与上面讲到的绑定相比,可空链式调用允许把多个查询串联为一个可空实例的值。即如果链式调用中的每个可空实例都包含值,那么每个调用都会成功,如果查询链中有一个可空实例为nil,那么整个链式调用就会返回nil。

看着挺复杂,其实就是方法调用

var errorCodeString: String!
errorCodeString = "404"var errorDescription: String?if let theError = errorCodeString, let errorCodeInteger = Int(theError), errorCodeInteger == 404 {errorDescription = "\(errorCodeInteger + 200): resource was not found."
}//这处用.调用就是可空链式调用
var upCaseErrorDescription = errorDescription?.uppercased()
print(upCaseErrorDescription) //~~ Optional("604: RESOURCE WAS NOT FOUND.")

可空类型的值修改

术语称为原地修改,目的是避免创建新变量的麻烦,这种修改方式不受nil值的限制(仅限于?),在上面的示例代码中再添加几何观察下输出:

upCaseErrorDescription?.append(" PLEASE TRY AGAIN.")
//~~ Optional("604: RESOURCE WAS NOT FOUND. PLEASE TRY AGAIN.")
print(upCaseErrorDescription)errorDescription = nil
let description = errorDescription ?? "No error"
//~~ No error
print(description)

可空类型运算

用??来实现便捷操作,相当于三元运算符,但??写法只能用于可空类型

var errorDescription: String?
let description = errorDescription ?? "No error" //No errorerrorDescription = "500"
description = errorDescription ?? "No error" //500//隐式展开可空类型,使用时一定不能为空,不然会报错
var test:String!
let aa:String? = nil //nil
var bb = aa ?? "hha" //hha

使用可空类型有几点需要注意的点:

  • ?号表示可空类型,等价于var errorCodeString: String? = nil,但不等价于var errorCodeString: String = nil,因为可空类型会有很多新特征可以使用;
  • 在?和!的取舍上尽量用?,只有在知道可空实例一定不会为nil或一旦为nil程序就会退出时才可以使用!。

print打印函数

标准结构如下所示:

print("The request failed")var errorString: String = "The request failed"
print(errorString)

占位符

在拼装字符串时,可用占位符模式,语法格式:“\(varName) ”

let numberOfStoplights: Int = 4
var population: Int = 5422
let townName: String = "Londo"
let townDescription = "\(townName) has a population of \(population) and \(numberOfStoplights) stoplights."//~~Londo has a population of 5422 and 4 stoplights.
print(townDescription)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/826716.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AppWizard的软件开发GUI的使用记录

前言 这个软件是针对于EmWin6.0以上的这个软件在emWin的基础上又封装了一层,也只提供的API函数.基于消息事件为核心&#xff08;个人理解&#xff09;一些组件的之间的交互可以通过软件界面进行配置,比较方便本次是基于模拟器进行测试记录,观察api 按键和文本之间的关联 通过…

基于SpringBoot+Vue七匹狼商城系统的设计与实现

系统介绍 近年来随着社会科技的不断发展&#xff0c;人们的生活方方面面进入了信息化时代。计算机的普及&#xff0c;使得我们的生活更加丰富多彩&#xff0c;越来越多的人使用通过网络来购买各类的商品。早期商品的销售和购买都是通过实体店&#xff0c;这种购买方式需要耗费…

分析和比较深度学习框架 PyTorch 和 Tensorflow

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 深度学习作为人工智能的一个重要分支&#xff0c;在过去十年中取得了显著的进展。PyTorch 和 TensorFlow 是目前最受欢迎、最强大的两个深度学习框架&#xff0c;它们各自拥有独特的特点和优势。 1. Py…

网络编程学习——IO多路复用

目录 ​编辑 一&#xff0c;多路复用 1&#xff0c;IO的分类 2&#xff0c;IO的效率 二&#xff0c;Linux环境下实现通信的多路复用 1&#xff0c;select select的特点&#xff1a; 参数&#xff1a; 操作函数&#xff1a; 返回值&#xff1a; 使用select实现网络通信…

B树和B+树试题解析

一、单项选择题 01&#xff0e;下图所示是一棵&#xff08;A ). A.4阶B树 B.3阶B树 C.4阶B树 D.无法确定 02.下列关于m阶B树的说法中&#xff0c;错误的是( C ). A.根结点至多有m棵子树 B.所有叶结点都在同一层次上 C.非叶结点至…

JAVAEE——IP协议

文章目录 IP协议IP协议报头格式IP协议报头的各个区段四位版本四位首部长度八位服务类型16位总长度16位标识&#xff0c;3位标志&#xff0c;13位片偏移八位生存时间八位协议 地址管理IP地址解决提议1&#xff1a;动态分配Ip地址解决提议2&#xff1a;NAT机制 IP协议 IP协议报头…

超越GPT-4V,苹果多模态大模型上新,神经形态计算加速MLLM(二)

上文介绍基于MINOnets神经网络架构加速多模态大模型的策略&#xff0c;本文将以Spinnaker2多核神经网络芯片EGRU架构为起点&#xff0c;覆盖存内计算架构&#xff0c;介绍新型计算架构在加速大模型推理的作用。SpiNNaker 2是一个设计用于大规模异步处理的多核神经形态芯片&…

openGauss学习笔记-267 openGauss性能调优-TPCC性能调优测试指导-网络配置-网卡多中断队列设置

文章目录 openGauss学习笔记-267 openGauss性能调优-TPCC性能调优测试指导-网络配置-网卡多中断队列设置267.1 操作步骤 openGauss学习笔记-267 openGauss性能调优-TPCC性能调优测试指导-网络配置-网卡多中断队列设置 本章节主要介绍openGauss数据库内核基于鲲鹏服务器和openE…

T3BI T3BI RS-232通讯操作指南与培训PPT课件

T3BI T3BI RS-232通讯操作指南与培训PPT课件

Python连接Oracle数据库问题解决及Linux服务器操作知识

背景说明 最近在做一个视频分析的项目&#xff0c;然后需要将视频分析的数据写入到oracle数据库&#xff0c;直接在服务器上测试数据库连接的时候出现了这个bug提示&#xff0c;自己通过不断的研究探讨&#xff0c;最终把这个问题成功进行了解决&#xff0c;在这里进行一下记录…

701强连通分量(python)

看见题目知道时间复杂度不超过&#xff08;mlogm&#xff09;。 这题用强连通分量 Tarjan 算法&#xff0c;强联通&#xff1a;对于任意两个点u和v&#xff0c;u可以到达v&#xff0c;v也可以到达u。这题需要考虑有重边&#xff0c;自环&#xff0c;同样别忘记可能会有两个点u…

Linux 操作系统编译器、静态库、动态库

1、编辑器 1.1、vim的安装 指令&#xff1a;sudo apt-get install vim 1.2 vim的使用 格式&#xff1a;vim 文件名 如果文件存在&#xff0c;只打开&#xff0c;文件不存在&#xff0c;创建并打开 vim的4中模式&#xff1a; 命令模式&#xff0c;插入模式&#xff0c;底行模…

Excel数据处理:高级筛选、查找定位、查找函数(VLOOKUP)

高级筛选 先去选中筛选区域 如果筛选的条件在同一行那么就是且的关系 如果筛选的条件不在同一行那么就是或的关系 查找定位空值 使用VLOOKUP函数

渗透测试入门教程,从零基础入门到精通(非常详细)

目录 什么是渗透测试 渗透测试的重要性 渗透测试的前置技能 开始入门学习路线 什么是渗透测试 渗透测试&#xff0c;通常被视为模拟黑客的一种安全评估行为&#xff0c;其目的在于全面挖掘目标网站或主机的潜在安全漏洞。与真实的黑客攻击不同&#xff0c;渗透测试旨在发现…

Spring定时器 Cron表达式的用法

前言 Cron表达式是一种用于描述定时任务执行时间的字符串格式&#xff0c;这种表达式基于时间字段来定义任务应该在哪些时间点执行&#xff0c;通常包含六个或七个用空格隔开的字段&#xff0c;分别代表秒、分钟、小时、日期、月份和星期&#xff08;年份是可选的&#xff09;…

系统架构最佳实践 -- 相关JAVA架构

1. java 类加载器架构 2. JVM 架构 3. Java 技术体系 4. 线程运行架构 5. Java 体系&#xff08;编译与运行&#xff09;结构 6. JMS 技术架构 7. JMX 技术架构 8. Spring 架构 9. Hibernate 架构 10. ibatis 架构 11. Struts2 架构 12. Struts1 架构 13. JBPM 14. EJB 技术架构…

万字总结!Docker简介及底层关键技术剖析

本文首发在个人博客上&#xff1a;万字总结&#xff01;Docker简介及底层关键技术剖析 Docker 简介 Docker 是一个开源的应用容器引擎&#xff0c;基于 Go 语言 并遵从 Apache2.0 协议开源。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中&#x…

滚动条详解:跨平台iOS、Android、小程序滚动条隐藏及自定义样式综合指南

滚动条是用户界面中的图形化组件&#xff0c;用于指示和控制内容区域的可滚动范围。当元素内容超出其视窗边界时&#xff0c;滚动条提供可视化线索&#xff0c;并允许用户通过鼠标滚轮、触屏滑动或直接拖动滑块来浏览未显示部分&#xff0c;实现内容的上下或左右滚动。它在保持…

补档 -- 测试的分类(1)

最近有很多人私信我说: 灰灰你什么时候写测试分类阿, 本来我要开始肝性能测试的, 我一看, 奥, 之前摸鱼忘写了, 所以这里补档(叶问指着一边笑.jpg). 总览 标红的需要注意一下. 为什么要对软件测试进行分类? 软件测试是软件生命周期的一个重要环节, 具有较高的复杂性, 对于软…

排序 “叁” 之交换排序

目录 1. 基本思想 2.冒泡排序 2.1 基本思想 2.2 代码示例 2.3 冒泡排序的特性总结 3.快速排序 3.1 基本思想 &#x1f335;hoare版本 &#x1f335;挖坑法 ​编辑 &#x1f335;前后指针版本 ​编辑 3.2 快速排序优化 &#x1f33b;三数取中法选key 3.4 快速排序…