余晖落尽暮晚霞,黄昏迟暮远山寻
本站
当前位置:网站首页 > 编程知识 > 正文

Swift基础-基本数据类型(swift 类属性)

xiyangw 2022-12-03 11:56 26 浏览 0 评论

常量和变量

用let声明常量,用var声明变量

let numberOne = 10

var numberTwo = 0

同一行中声明多个常量或者多个变量,可以用逗号隔开:

var x = 0.0, y = 0.0, z = 0.0

类型标注

用来表明常量或者变量中要存储的值的类型。格式为,在常量或者变量名后面加上一个冒号和空格,然后加上类型名称。

如下例子给message变量添加了类型标注,表示这个变量可以存储String类型的值:

var message: String

在同一行中定义多个同样类型的变量,可以用逗号分割,并在最后一个变量名之后添加类型标注:

var red, green, blue: Double

常量和变量的命名可以用任何你喜欢的字符作为常量和变量名,包括 Unicode 字符:

let π = 3.1415926

let你好 = "你好这个世界"

let = "dogandcow"

常量与变量名不能包含数学符号,箭头,保留的(或者非法的)Unicode 码位,连线与制表符。也不能以数字开头。

输出常量和变量

print(friendly)

// 输出 "Bonjour!"

print(_:separator:terminator:)是一个用来输出一个或多个值到适当输出区的全局函数。

Swift 用字符串插值(string interpolation)的方式把常量名或者变量名当做占位符加入到长字符串中,Swift 会用当前常量或变量的值替换这些占位符。将常量或变量名放入圆括号中,并在开括号前使用反斜杠将其转义:

print("The current value of friendly is \(friendly)")

// 输出 "The current value of friendly is Bonjour!

注释

// 这是一个注释

/* 这是一个, 多行注释 */

/* 这是第一个多行注释的开头 /* 这是第二个被嵌套的多行注释 */ 这是第一个多行注释的结尾 */

分号

Swift 并不强制要求在语句的结尾处使用分号(;)当你打算在同一行内写多条独立的语句时,必须使用分号如下:

let cat = ""; print(cat)

// 输出 ""

整数

Swift 提供了8,16,32和64位的有符号和无符号整数类型。这些整数类型和 C 语言的命名方式很像,比如8位无符号整数类型是UInt8,32位有符号整数类型是Int32。就像 Swift 的其他类型一样,整数类型采用大写命名法。

整数范围

你可以访问不同整数类型的min和max属性来获取对应类型的最小值和最大值:

let minValue = UInt8.min// minValue 为 0,是 UInt8 类型

let maxValue = UInt8.max// maxValue 为 255,是 UInt8 类型

Int

Swift 提供了一个特殊的整数类型Int,长度与当前平台的原生字长相同:

?在32位平台上,Int和Int32长度相同。

?在64位平台上,Int和Int64长度相同。

UInt

Swift 也提供了一个特殊的无符号类型UInt,长度与当前平台的原生字长相同:

?在32位平台上,UInt和UInt32长度相同。

?在64位平台上,UInt和UInt64长度相同。

类型安全和类型推断

如果你没有显式指定类型,Swift 会使用类型推断(type inference)来选择合适的类型。有了类型推断,编译器可以在编译代码的时候自动推断出表达式的类型。原理很简单,只要检查你赋的值即可。

数值型字面量

整数字面量可以被写作:

?一个十进制数,没有前缀

?一个二进制数,前缀是0b

?一个八进制数,前缀是0o

?一个十六进制数,前缀是0x

下面的所有整数字面量的十进制值都是17:

let decimalInteger = 17

let binaryInteger = 0b10001// 二进制的17

let octalInteger = 0o21// 八进制的17

let hexadecimalInteger = 0x11// 十六进制的17

整数和浮点数转换

整数和浮点数的转换必须显式指定类型:

let three = 3

let pointOneFourOneFiveNine = 0.14159

let pi = Double(three) + pointOneFourOneFiveNine

类型别名

类型别名(type aliases)就是给现有类型定义另一个名字。

例如下:

typealias AudioSample = UInt16

var maxAmplitudeFound = AudioSample.min

// maxAmplitudeFound 现在是 0

布尔值

Swift 有一个基本的布尔(Boolean)类型,叫做Bool。Swift 有两个布尔常量,true和false:

let orangesAreOrange = true

let turnipsAreDelicious = false

元组

元组(tuples)把多个值组合成一个复合值。元组内的值可以是任意不同类型

例:(404, "Not Found")

let http404Error = (404, "Not Found")

// http404Error 的类型是 (Int, String),值是 (404, "Not Found")

(404, "Not Found")元组把一个Int值和一个String值组合起来表示 HTTP 状态码的两个部分:一个数字和一个人类可读的描述。这个元组可以被描述为“一个类型为(Int, String)的元组”。

你可以将一个元组的内容分解(decompose)成单独的常量和变量,然后你就可以正常使用它们了:

let (statusCode, statusMessage) = http404Error

print("The status code is \(statusCode)")

// 输出 "The status code is 404"

print("The status message is \(statusMessage)")

// 输出 "The status message is Not Found"

如果你只需要一部分元组值,分解的时候可以把要忽略的部分用下划线(_)标记:

let (justTheStatusCode, _) = http404Error

print("The status code is \(justTheStatusCode)")

// 输出 "The status code is 404"

此外,你还可以通过下标来访问元组中的单个元素,下标从零开始:

print("The status code is \(http404Error.0)")

// 输出 "The status code is 404"

print("The status message is \(http404Error.1)")

// 输出 "The status message is Not Found"

你可以在定义元组的时候给单个元素命名:

let http200Status = (statusCode: 200, description: "OK")

给元组中的元素命名后,你可以通过名字来获取这些元素的值:

print("The status code is \(http200Status.statusCode)")

// 输出 "The status code is 200"

print("The status message is \(http200Status.description)")

// 输出 "The status message is OK"

可选类型

使用可选类型(optionals)来处理值可能缺失的情况。可选类型表示:

?有值,等于 x

或者

?没有值

来看一个例子。Swift 的Int类型有一种构造器,作用是将一个String值转换成一个Int值。然而,并不是所有的字符串都可以转换成一个整数。字符串"123"可以被转换成数字123,但是字符串"hello, world"不行。

下面的例子使用这种构造器来尝试将一个String转换成Int:

let possibleNumber = "123"

let convertedNumber = Int(possibleNumber)

// convertedNumber 被推测为类型 "Int?",或者类型 "optional Int"

因为该构造器可能会失败,所以它返回一个可选类型(optional)Int,而不是一个Int。一个可选的Int被写作Int?而不是Int。问号暗示包含的值是可选类型,也就是说可能包含Int值也可能不包含值。(不能包含其他任何值比如Bool值或者String值。只能是Int或者什么都没有。)

nil

你可以给可选变量赋值为nil来表示它没有值:

var serverResponseCode: Int? = 404

// serverResponseCode 包含一个可选的 Int 值 404

serverResponseCode = nil

// serverResponseCode 现在不包含值

注意:

nil不能用于非可选的常量和变量。如果你的代码中有常量或者变量需要处理值缺失的情况,请把它们声明成对应的可选类型。

如果你声明一个可选常量或者变量但是没有赋值,它们会自动被设置为nil:

var surveyAnswer: String?

// surveyAnswer 被自动设置为 nil

注意:

Swift 的nil和 Objective-C 中的nil并不一样。在 Objective-C 中,nil是一个指向不存在对象的指针。在 Swift 中,nil不是指针——它是一个确定的值,用来表示值缺失。任何类型的可选状态都可以被设置为nil,不只是对象类型。

if 语句以及强制解析

你可以使用if语句和nil比较来判断一个可选值是否包含值。你可以使用“相等”(==)或“不等”(!=)来执行比较。

如果可选类型有值,它将不等于nil:

if convertedNumber != nil {

print("convertedNumber contains some integer value.")

}

// 输出 "convertedNumber contains some integer value."

当你确定可选类型确实包含值之后,你可以在可选的名字后面加一个感叹号(!)来获取值。这个惊叹号表示“我知道这个可选有值,请使用它。”这被称为可选值的强制解析(forced unwrapping):

相关推荐

spring利用spring.handlers解析自定义配置(spring validation 自定义)

一、问题我们在spring的xml配置文件里经常定义各种各样的配置(tx、bean、mvc、bean等等)。以及集成第三方框架时,也会看到一些spring之外的配置,例如dubbo的配置、securi...

「Spring源码分析」AOP源码解析(上篇)(spring源码深度解析(第2版))

前言前面写了六篇文章详细地分析了SpringBean加载流程,这部分完了之后就要进入一个比较困难的部分了,就是AOP的实现原理分析。为了探究AOP实现原理,首先定义几个类,一个Dao接口:1&nbs...

Spring 解析注册BeanDefinition这一篇就Over
Spring 解析注册BeanDefinition这一篇就Over

一、简介:学习过Spring框架的人一定都会听过Spring的IoC(控制反转)、DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC、...

2023-03-20 14:53 xiyangw

域、模块、空间、闭包,你真的懂了吗?(模块控制域与作用域的关系)

Javascript有一个特性叫做域。尽管对于初学者来说理解域是有难度的,但我会尽力用最简单的方式让你理解域。理解域能让你的代码更优秀,减少错误,及有助于你做出更强大的模式设计。什么是域域是在运行时,...

这一次搞懂Spring自定义标签以及注解解析原理
这一次搞懂Spring自定义标签以及注解解析原理

前言在上一篇文章中分析了Spring是如何解析默认标签的,并封装为BeanDefinition注册到缓存中,这一篇就来看看对于像context这种自定义标签是如...

2023-03-20 14:53 xiyangw

前端基础进阶(七)-前端工程师最容易出错的问题-this关键字
前端基础进阶(七)-前端工程师最容易出错的问题-this关键字

我们在学习JavaScript的时候,因为对一些概念不是很清楚,但是又会通过一些简洁的方式把它给记下来,那么这样自己记下来的概念和真正的概念产生了很强的偏差.当...

2023-03-20 14:52 xiyangw

深入K8s:守护进程DaemonSet及其源码分析(k8s 进程)
深入K8s:守护进程DaemonSet及其源码分析(k8s 进程)

建议学习:膜拜!阿里内部都在强推的K8S(kubernetes)学习指南,不能再详细了最近也一直在加班,处理项目中的事情,发现问题越多越是感觉自己的能力不足,...

2023-03-20 14:52 xiyangw

Spring 是如何解析 bean 标签的?(spring beans标签)
Spring 是如何解析 bean 标签的?(spring beans标签)

前情回顾上回「SpringIoC容器初始化(2)」说到了Spring如何解析我们定义的<bean>标签,代码跟进了一层又一层,跋山涉水,...

2023-03-20 14:52 xiyangw

快速了解JavaScript文本框操作(javascript文本框代码)
快速了解JavaScript文本框操作(javascript文本框代码)

HTML中使用<input>元素表示单行输入框和<textarea>元素表示多行文本框。HTML中使用的<input&...

2023-03-20 14:51 xiyangw

荐读|30道JavaOOP面试题,可以和面试官扯皮了
荐读|30道JavaOOP面试题,可以和面试官扯皮了

面试是我们每个人都要经历的事情,大部分人且不止一次,今天给大家准备了30道JavaOOP面试题,希望能够帮助到对Java感兴趣的同学,让大家在找工作的时候能够...

2023-03-20 14:51 xiyangw

源码系列——mybatis源码刨析总结,下(mybatis源码分析)
源码系列——mybatis源码刨析总结,下(mybatis源码分析)

接上文简答题一.1.Mybatis动态sql是做什么的?1.动态sql就是根据条件标签动态的拼接sql,包括判空,循环,拼接等2.哪些动态sql?动态sql大...

2023-03-20 14:50 xiyangw

Java面试题(第二弹)(java面试题及答案整理)
Java面试题(第二弹)(java面试题及答案整理)

1.抽象类和接口的区别?接口可以被多重implements,抽象类只能被单一extends接口只有定义,抽象类可以有定义和实现接口的字段定义默认为:public...

2023-03-20 14:50 xiyangw

mybatis3 源码深度解析-动态 sql 实现原理(sql数据库基础知识)
mybatis3 源码深度解析-动态 sql 实现原理(sql数据库基础知识)

大纲动态sql使用示例SqlSource和BoundSql以及实现类LanguageDriver以及实现类SqlNode以及实现类动态sql解...

2023-03-20 14:50 xiyangw

第43节 Text、Comment及CDATASection(第43节 Text、Comment及CDATASection)
第43节 Text、Comment及CDATASection(第43节 Text、Comment及CDATASection)

本内容是《Web前端开发之Javascript视频》的课件,请配合大师哥《Javascript》视频课程学习。文本节点用Text类型表示,包含的是可以按字面解释...

2023-03-20 14:49 xiyangw

Qt读写三种文件(qt读取文件数据并赋值给变量)

第一种INI配置文件.ini文件是InitializationFile的缩写,即初始化文件。除了windows现在很多其他操作系统下面的应用软件也有.ini文件,用来配置应用软件以实现不同用户的要...

取消回复欢迎 发表评论: