当前位置: 首页 > 编程日记 > 正文

【Swift】变量/常量/类型总结

1、变量(Variable)

变量,可以理解为存放某一类型的值的容器,如:

var count:Int
var shouldRemind:BOOL
var text:String
var list:[ChecklistItem]

一个变量的数据类型,决定了它能存放什么类型的数据。有些变量只存放简单的值,如Int、Bool。另一些变量存放相对复杂一些的类型例如String、Array。

常见的基本数据类型:
存放整数的Int
存放浮点数的Float
存放布尔值的boolean
存放双精度浮点数的Double
存放单个字符的Characters
存放正整数的UInt
Core Graphics中存放浮点数的CGFloat

Swift对类型是很严格的,例如不能将一个Float类型的数据赋值给一个Int类型的变量。同样地,反过来也不行,Swift并不会自动帮我们转换。如:

var i = 10
var f: Float
f = i        //错误的
f = Float(i) //正确的

但在我们声明变量时,如果有初始值,我们可以不具体说明变量类型。Swift会使用类型推论(type inference),自动根据初始值决定数据类型。

var i = 10     //Int
var d = 3.14   //Double
var b = true   //BOOL
var s = "Hello,word" //String

上面例子中,d赋值为3.14时,Swift会推断为Double类型,即此时d为Doule类型变量。如果我们希望d为Float类型变量,可以加上显式的类型说明,以覆盖Swift的类型推论:

var f:Float = 3.14

对于类对象,我们需要先实例化对象。
我们来看一个例子(假定我们已创建了自定义的待办事件类ChecklistItem):

var item: ChecklistItem

对于上面的代码,我们声明了一个可以存放ChecklistItem对象的变量,但此时还没创建ChecklistItem对象,为此我们需要:

item = ChecklistItem()

执行上面的代码,我们称之为实例化对象,即创建了一个对象的实例。具体为:为实例分配一段内存空间,并调用默认的初始化方法。每个实例都会占用一段内存空间,实例保存着对象的属性。对于这句代码中的item,我们称之为实例变量。
当然,我们可以将上面两句代码合并为一句:

var item = ChecklistItem()

这里省略掉了显式的类型声明,因为Swift会通过类型推断,自动判定其为ChecklistItem类型,但是不能省略“()”,括号告诉了Swift我们需要创建一个ChecklistItem类型的实例。

有时,我们在创建对象实例时,会传入一些参数,例如:

var item = ChecklistItem(text:"Charge my iPhone",checked:false)

1、局部变量 vs 实例变量

我们常见的变量可以分为

  • 局部变量:只存活在所声明的函数方法内。方法结束,就会被销毁。
  • 实例变量:又称为属性,属于实例,在实例的所有方法中都可以使用。

看个例子:

class MyObject{var count = 0 //实例变量func myMethod(){var temp: Int //局部变量temp = count}//在myMethod方法之外,局部变量“temp”已不存在
}

如果局部变量和实例变量名字相同,此时在局部变量所在的方法内,会隐藏实例变量,我们应该避免这种情形,防止在我们希望用实例变量时,不小心用成了局部变量。(为了避免此类问题,我们可以在命名实例变量时,在其前添加下划线,如_count。或在方法内使用实例变量时,添加self)

3、变量 vs 常量

除了变量可以存放数据,常量也可以。

变量存储的数据,可以在app运行期间被改动。例如,在日记app中,用户可以修改日记中的文字,所以应该使用String类型的变量,当用户编辑日记时,变量可以跟着改变。有时我们需要保存固定不变的数据,例如保存一个一旦计算完后就不会再变化的计算结果,此时我们可以使用常量。例如:

let pi = 3.141592
let difference = abs(targetValue - currentvalue)
let message = "You scored \(points) points"
let image = UIImage(named:"SayCheese")

如果常量声明在函数方法内,常量会在方法结束时被销毁。而每次调用方法,都会重新创建一个常量,并且能被赋一个新值。在方法执行过程中它的值不能被修改。

4、值类型 vs 引用类型

基本数据类型(如int、string)、struct(如String、Array)、enum属于值类型,使用let声明为常量时,它的值不允许被改变:

let pi = 3.141592
pi = 3  //错误

类属于引用类型,当使用let声明为常量时,只有引用关系不允许被改变,而被引用的对象本身是可以改变的:

let item = ChecklistItem()
item.text = "Do the laundry"
item.checked = false
item.dueDate = yesterday

但是这样是不允许的:

let item = ChecklistItem()
item = anotherItem

相关文章:

ODBC更新记录集提示”记录集为只读“

创建的ODBC应用程序默认的记录集不具有只读属性,但是再更新记录表时会提示”记录集为只读“,这是为什么呢? 今天看书找到了答案: 因为MFC中的数据库类不支持需要连接两个或者多个表的记录集更新,如果选择数据源的时候选…

gzip格式分析与识别

“ 介绍gzip格式,识别gzip压缩的数据流量。”在协议分析过程中,经常会发现gzip压缩的数据,例如在HTTP协议中,在HTTP头中会标示,内容编码为gzip、DEFLATE。但是,还有很多情况,例如一些非HTTP协议…

CSS 和 JS 动画哪个更快

基于Javascript的动画暗中同CSS过渡效果一样,甚至更加快,这怎么可能呢?而Adobe和Google持续发布的富媒体移动网站的性能可媲美本地应用,这又怎么可能呢? 本文逐一遍览了基于Javascript的DOM动画库,如Veloci…

C语言之分支结构 if(一)

一 程序的三种基本结构 顺序结构:程序从上往下依次执行,这个叫顺序结构 分支结构:有选择的执行或者不执行某段代码 循环结构:重复的执行某段代码 二 分支结构之if 最简单的俩种用法 (tips: if语句后面的大括号可以省略&#xff1a…

react-native安装Ant Design

1.集成Ant Design到项目 项目根目录中执行命令: npm install ant-design/react-native --save2.集成按需加载babel-plugin-import到项目 项目根目录中执行命令: npm install --save-dev babel-plugin-import3.创建.babelrc文件 根目录中创建新文件…

车联网APP,安全设施薄弱的山寨品

“ 目前的车联网APP,几乎没有安全性可言。”在网络上闲逛,一不小心,逛进了车联网的领地。物联网、车联网、IoT如火如荼,各个大佬、院士加持,看着相当的高大上。但是,在伟岸的外表下,到底真实的情…

CSS里总算是有了一种简单的垂直居中布局的方法了

<!DOCTYPE html> <html xmlns"http://www.w3.org/1999/xhtml"> <head><meta http-equiv"Content-Type" content"text/html; charsetutf-8"/><title>无标题文档</title><style type"text/css"&…

【星榜单】盘点那些坑爹的国产手机们

【星榜单】盘点那些坑爹的国产手机们 国产手机的那些坑爹事儿很多&#xff0c;中庸到基本大众脸的设计还算是有点良心的&#xff0c;那些奇葩的名字、所谓的高配低价低却又山寨级的做工、饥饿营销让你看得到买不到、伪小清新却又华而不实放眼过去的国产智能手机比比皆是&#x…

App Tracking Transparency被拒解决

App Tracking Transparency 如果使用了App Tracking Transparency&#xff0c;苹果要求在iOS 14.5及以上的版本中必须在弹框取得用户同意后&#xff0c;才可以跟踪用户。否则会被拒&#xff1a; 解决方案 参照官方文档说明&#xff08;https://developer.apple.com/documen…

ProtoBuf格式详解

“介绍protobuf编码格式。”protobuf是一种数据交换格式&#xff0c;又称PB编码&#xff0c;由Google开源&#xff0c;类似于Json、XML&#xff0c;但其内部是纯二进制格式&#xff0c;比Json&#xff0c;XML等格式要更精炼&#xff0c;主要用于数据的序列化和反序列化&#xf…

Android studio 第二次作业

作业要求&#xff1a; 作一个显示框里面分成三行 一二行占这个框的1/2 第三行独占1/2 第三行里面分成两列第一列占25%&#xff0c;第二列占75%。 屏幕显示效果 实现步骤&#xff1a; <LinearLayout android:orientation"vertical"注意这里是横向布局 …

Cable master (POJ No.1064)

二分搜索思想&#xff1a;bool C(double x)可以得到长度为x的绳子//#define LOCAL #include<stdio.h> #include<math.h> int const MAX_N10005; int const MAX_M100; double const INF100000000; int N,K; double d[MAX_N],lb,ub; //判断是否满足条件 bool C(doubl…

iOS 11 导致tableview 刷新之后漂移问题

在10 系好好的&#xff0c;在11系统刷新只有就会多一个白块。查询才返现&#xff0c;添加一下代码 完美解决此bugself.mainTableView.estimatedRowHeight 0; self.mainTableView.estimatedSectionHeaderHeight 0; self.mainTableView.estimatedSectionFooterHeight 0;

HTTP协议解析之Cookie

“ Cookie与身份认证。”提到HTTP协议&#xff0c;不可避免地都会牵涉到Cookie&#xff0c;可以说&#xff0c;Cookie作为HTTP的重要组成部分&#xff0c;促进了HTTP协议的发展壮大。HTTP协议如果没有了Cookie&#xff0c;将会是一个无状态&#xff0c;无法便捷地进行用户识别的…

libevent源码深度剖析十一

libevent源码深度剖析十一 ——时间管理 张亮 为了支持定时器&#xff0c;Libevent必须和系统时间打交道&#xff0c;这一部分的内容也比较简单&#xff0c;主要涉及到时间的加减辅助函数、时间缓存、时间校正和定时器堆的时间值调整等。下面就结合源代码来分析一下。 1 初始化…

CentOS 安装Apache

# centOS 安装A M P 环境[参考简书作者,非常感谢&#xff01;&#xff01;&#xff01;](https://www.jianshu.com/p/bc14ff0ab1c7) ## 一 Apache 环境安装 1 安装Apache > yum install httpd2 操作指令一览 > systemctl start httpd //启动apache > systemct…

使用admin lte 碰到访问Google字体的问题

下载了admin lte 的模板&#xff0c;运行的时候&#xff0c;发现很慢&#xff0c;看了一下console,发现adminlte.css里有import google的字体文件&#xff0c;众所周知的原因&#xff0c;无法访问&#xff0c;所以网页很慢&#xff0c;没办法&#xff0c;只能下载到本地了,cnbl…

如何突破DNS报文的512字节限制

“DNS协议大家都应该很熟悉&#xff0c;最近有同学问到如何获得UDP承载的超过512字节的DNS报文&#xff0c;借此机会&#xff0c;我们一起了解下DNS协议与报文长度有关的一些细节。”本文将讨论的是DNS协议在UDP承载时超过512字节的这一细节。在之前的文章里&#xff0c;对DNS协…

Fragment为什么须要无参构造方法

日前在项目代码里遇到偷懒使用重写Fragment带参构造方法来传参的做法&#xff0c;顿生好奇&#xff0c;继承android.support.v4.app.Fragment而又不写无参构造方法不是会出现lint错误编译不通过的咩&#xff1f;仔细追究&#xff0c;原来是这货被加了SuppressLint("ValidF…

CentOS 安装FTP

# 安装FTP * 1 安装命令> yum -y install vsftpd * 2 使用如下命令增加账户&#xff0c;其中 /var/www/html 是我们的 ftp 目录&#xff0c;ftpadmin 为 ftp 用户名。 > useradd -d /var/www/html -s /sbin/nologin ftpadmin * 3 给 ftpadmin 这个用户设置密码 > pa…

HTTP协议中的Range和Content-Range

“ 琢磨HTTP协议的每一个细节。”HTTP协议博大精深&#xff0c;每一个细节都应细细体会。否则&#xff0c;在协议还原的过程中&#xff0c;你会遇到各种问题。今天&#xff0c;本文中将对HTTP协议的Range和Content-Range进行分析。Range和Content-Range是 HTTP/1.1中新增的HTTP…

【HTML5游戏开发】简单的《找不同汉字版》,来考考你的眼力吧

一&#xff0c;准备工作 本次游戏开发需要用到lufylegend.js开源游戏引擎&#xff0c;版本我用的是1.5.2&#xff08;现在最新的版本是1.6.0&#xff09;。 引擎下载的位置&#xff1a;http://lufylegend.googlecode.com/files/lufylegend-1.5.2.rar 引擎API文档&#xff1a;ht…

FTP 命令的使用详解

# 使用Terminal 连接FTP ####Tips: 1 通过!进入本地主机的shell&#xff0c;然后通过exit退出本地主机进入远程服务器shell 2 要把文件下载到哪一个目录 就要先cd 到 哪个目录&#xff0c;再去进行ftp 连接&#xff0c;这样 执行 get 文件 自动下载到目录3 下载的文件的时候…

html 11 内联(行内)

行内元素 <span> 块级元素 <div> <p> <section> <header> <footer> 行内元素&#xff0c;这是高 margin-top margin-bottom 无意义 &#xff0c;无效果&#xff0c;因为它仅仅在行内 &#xff0c;它跳不出行&#xff0c;行多少它就多少。…

宅男抖音某猫协议分析及应用破解

“ 分析传说中的快x&#xff0c;顺便提供破VIP线路及去启动广告方法。”在当今这个由应用市场主导的网络上&#xff0c;流传着一批应用&#xff0c;它们低调又神秘&#xff0c;依赖口碑与独立网站在地下渠道传播&#xff0c;应用市场中从来都找不到它们的身影。这类应用&#x…

AdminLTE的使用

官方文档link1.AdminLTE的必要配置文件<!-- Tell the browser to be responsive to screen width --> <meta content"widthdevice-width, initial-scale1, maximum-scale1, user-scalableno" name"viewport"> <!-- Bootstrap 3.3.5 --> …

Linux sendmail发送邮件失败诊断案例(一)

在新服务器上测试sendmail发送邮件时&#xff0c;发现邮件发送不成功&#xff0c;检查日志文件发现如下错误&#xff08;Notice&#xff1a;由于涉及公司服务器&#xff0c;邮箱等&#xff0c;故下面hostname、邮箱地址等信息使用xxx代替&#xff09; tail -40 /var/log/maill…

CentOS 安装Python3

# 基于Linux的 Python3 环境的安装 最近买了一台centOS 阿里云轻量级服务器 自带Python2 准备安装Python3.6 版本的 ## Step * 1 查看当前版本python 的路径 使用以下命令,以便后面安装完毕 建立软链接 > which python 正常情况下会显示python 路径&#xff0c;例如…

某米浏览器黑名单文件破解

“粗粮系统自带浏览器的网址黑名单提取。”某米手机作为高性价比的代表&#xff0c;比起菊厂及OV厂妹风手机&#xff0c;向来被我高看一眼&#xff0c;毕竟雷布斯也是我等码农的典范&#xff0c;以至于我都买过好几件粗粮的产品。虽然它的各个应用&#xff0c;包括系统&#xf…

函数的四种调用模式.上下文调用.call.apply

闭包:函数就是一个闭包,一个封闭的作用域; 返回函数,要返回多个函数就用一个对象封装一下,立即执行函数return回调函数JS动态创建的DOM,不会被搜索引擎抓取,对SEO不友好./*window的name属性*/function fn(){ console.log(this.name);} fn.call({name:"zhangsan"});//…