swift5.1简明教程[更新中]

1.变量与常量

swift中使用var(variable)关键词来定义变量,使用let关键词来定义常量,例如:

var myNum = 10 // 定义一个Int类型的变量,它的值为10
let myStr = "Hello world" // 定义一个String类型的常量,它的值为"Hello World"

swift中的变量

变量中的存储值是可以改变的,在以上代码后加上:

myNum = 12 

则变量myNum的值就会由10改为12

swift中的var关键字与JavaScript中定义变量的var长得一模一样,但它们本质上是截然不同的。JavaScript是一种弱类型编程语言,一个变量中可以存储任意类型的数据。但是swift是一种强类型编程语言,变量中的数据类型是固定的,相对来说更加安全。如果我们在定义变量的时候,没有为它明确指定类型,编译器会自动根据变量的值来推导它的类型。在Xcode中,按住option键然后使用鼠标左键点击变量,会显示变量的类型:

01-01.png

如果我们想要明确地指定变量的数据类型,那么可以直接在变量后面使用冒号来标示它的类型,例如:

var myDouble: Double = 9.9

swift中的常量

常量中的值是不可以被改变的,如果我们试着改变常量中的值,例如在上面的代码后面添加以下语句:

myStr = "OK"

那么编译器会抛出一个错误,错误内容为:

Cannot assign to value: 'myStr' is a 'let' constant
(意思大致为:无法为常量'myStr'赋值)

当常量中的值为基础类型时,swift与Java表现基本一致。但如果常量中的值是引用类型,那么这两种语言会有一些差别。在Java中,常量指向的对象不可被改变,但是对象的值可以改变。而swift中常量指向的对象不能被改变,且该对象的值也不可改变。例如在Java中这样是正确的:

final ArrayList<String>  myArr = new ArrayList<>();
myArr.add("Hello");
myArr.add("World");
// 最终myArr的值为["Hello", "World"]

而在swift中,以下的代码是错误的:

let myArr:[String] = []
myArr.append("Hello") // !报错,错误内容:Cannot use mutating member on immutable value: 'myArr' is a 'let' constant

2.数据类型

swift中常用的数据类型可以分为三种,分别为数值型字符型以及复合类型

1-数值型

swift中的数值分为整数(整型)与小数(浮点型)两种类型。
在swift中,这两种类型之间是不能直接进行数据运算的,例如我们平时自然而然地会把整数与小数相加,例如1+0.1=1.1。但swift中如果你将一个整型变量与一个浮点型变量相加,那么Xcode会抛出一个错误。在大多数的计算机语言中,整型数据都是不可以直接跟浮点型数据进行直接运算的,这是由于两者在计算机内部存储的方式不同而导致的,在此我们不进行深入考究。如果我们需要将整型与浮点型数据进行数据运算,那么可以将整型的数据转化为浮点型数据再运算。例如:

let myInt = 10
let myDouble = 2.2
let result = Double(myInt) + myDouble // result为浮点型,值为12.2

整型

swift中的整型根据长度可以分为81632以及64四种,根据是否带符号分为Int与UInt(不可为负数)两种。两相结合,swift中的整数类型一共有IntInt8Int16Int32Int64UIntUInt8UInt16UInt32以及UInt64一共10种。其中IntUInt是一种简写,在32位系统中,它们的长度是32位;在64位的系统中,它们的长度是64位。
如果没有特别的需求,我们平时直接使用Int这种类型即可,这也是编译器默认的Int类型。如果是有特殊的要求,可以再进行深入探究。

浮点型

浮点型也就是我们常说的小数,主要分为DoubleFloat两种,我们直接使用Double即可。同时Double也是swift编译器默认的小数类型。

数据运算

待更新..

2-布尔类型

布尔Bool类型可以说是最简单的一种类型了,只有两个值truefalse,通常用来验证两个数据是否相等。我们使用一个等号=来给变量或者常量赋值,使用两个等号==来进行数据比较,例如:

let ageOfTom = 15
let ageOfJohn = 17
let ageOfLily = 17
print(ageOfTom == ageOfJohn)    // 结果为false
print(ageOfJohn == ageOfLily)   // 结果为true
        
let myHobby = "fishing"
let name = "fishing"
print(myHobby == name)          // 结果为true
myHobby.elementsEqual(name)     // true

值得一提的是,与Java中的字符串比较需要比较两个变量的内存地址不同,swift中如果两个字符串中的字符完全相同,那它们就是相等的。除了判断两个数据是否相等,我们还可以判断两个数据是否不相等!=,以及一个数是否大于>(以及大于或等于>=)或者小于<(以及小于或等于<=)另一个数。
另外一点需要注意的是,在Java或者JavaScript中,我们可以直接使用另一种数据类型来进行进行非空判断,例如在if - else语句中,编译器会自动将0转化为false进行运算。而swift中任何其他类型都不会被隐式地转化为布尔类型,需要我们显示地进行数据判断。

let myNum = 0
if (myNum) {...}         // 编译器报错
if (myNum == 0) {...}    //正确的写法

3-字符型

字符型Character变量可以存储一个字符,但是一般情况下我们都不会使用这种数据类型,在swift中如果我们定义某个变量时为它赋值为单个字符,编译器也会将其推断为String类型。同时,为了更好地理解这样的情况,我们也可以大致地将String类型看做为Character的集合。例如,我们可以遍历String中的每个字符:

let myLable = "O"   // myLable的类型为String
let myChar: Character = "C"   // 显示定义myChar的类型为Character类型

// 遍历打印String中的字符
let myStr = "Hello world!"
for i in myStr {
  print(i)
}

4-字符串

除了数据类型,字符串String类型可以说是我们平时接触最多的一种数据类型。我们常常使用字符串类型数据来存储诸如用户名、用户密码、用户电话号码等信息。如上文所说,我们可以将字符串看做为『一串字符』。字符串String类型和我们在上面所介绍的整型、浮点型以及字符型这三种基本数据类型不一样,它是一种复合型数据类型。后面我们要介绍的数据类型也都属于复合型的数据类型,并且它们都是建立在基本数据类型的基础上的。

1.字符串的声明

声明字符串类型的数据很简单,将一段由双引号("")将文字包裹起来即可。或者将双引号包裹着的文字传入String的构造函数中,但这种方式太繁琐,平时不建议这么做。但是使用String的构造函数来声明一个空字符串变量会显得更加直观:

let userName = "Tom"            // userName中的值为“Tom”
let greeting = String("Hi~")    // greeting中的值为"Hi~"
        
let emptyString =  ""           // 声明一个空字符串变量
let emptyString2 = String()     // 这也是一个空字符串变量,这种方式更加直观
2.字符串的拼接
  1. 使用运算符进行拼接 swift中可以使用加号+来进行两个字符串的拼接,甚至还可以使用数值加等号+=来进行运算:
let userName = "Tom"                // userName中的值为“Tom”
var greeting = String("Hi~")        // greeting中的值为"Hi~"
let myWord = greeting + userName    // myWord为"Hi~Tom"
greeting += userName                // greeting中的值现在为"Hi~Tom"
  1. 使用反斜线\插值 我们在使用字符串的时候,经常需要将一个变量的值添加到某一字符串中间。例如我们在显示欢迎语欢迎你,某某某,现在是北京时间12: 08: 09的时候,需要根据不同的用户来调整某某某具体的名字,这时候就需要进行字符串的插值。我们可以使用加号+来把用户名添加到句子中,但这种方法显得很笨重,并不优雅。我们还可以使用反斜线加圆括号\()的方式来进行插值,变量或者常量的名称卸载圆括号里面,编译器会自动将其解析为正确的语句:
let userName = "Tom"
let result = "欢迎你," + userName + ",现在是北京时间12: 08: 09"   //第一种方式,笨重而不够优雅
let result2 = "欢迎你,\(userName),现在是北京时间12: 08: 09"       //第二种方式,简单而优雅
  1. 使用占位符插值 平时我们在输出时间的时候——例如上面的时间,我们通常需要在只有一位数字的时候进行补零,例如上面代码中的12: 08: 09,否则12: 8: 9看起来就很奇怪。在显示小数的时候,有时也会遇到保留几位小数的情况,这时候就需要使用String(format: String, _ arguments: CVarArg..)构造方法,使用占位符来插值进到字符串中。这种方法与C语言中的数值插值基本相同:
let h = 12, m = 8, s = 9
let timeString = String(format: "北京时间:%02d: %02d: %02d", h, m, s) // 北京时间:12: 08: 09
let cost = 10000.49999
let costString = String(format: "金额为:%.3f", cost)                 // 金额为:10000.500

5-数组

Swift中,数组使用Array来表示,它是一系列数据的集合,存储在其中的每个数据都有对应的索引值。可以参考官方提供的图片:

Array.png

数组Array的索引值从0开始,直到总数据数n减一n-1位。Swift中的数组Array、集合Set以及字典Dictionary这三种数据结构都采用了泛型来实现,所以它们可以用来存储任意一种数据。但是存储在其中的数据类型一旦被确定,则不能再更改。例如一个数组Array在定义的时候明确了是用来存储整形Int数据的,它就不能用来再存储字符串String或其他数据,反之亦然。为了方便理解,以下直接使用代码来说明数组Array的初始化、数据的增、删、改,以及遍历数据和其他常用方法等:

        // 创建一个空数组,存储数据类型为String
        let arr1 = [String]()
        // 使用另一种方法创建一个空数组,存储数据类型为Int
        let arr2 = Array<Int>()
        // 创建一个数组,并存入String类型数据
        var arr3 = ["Li Lei", "Han Meimei", "Kate"]
        // 创建一个数组,并存入Double类型数据
        let arr4: [Double] = [0.1, 0.3, 6.9]

        // 向数组最后添加一个数据
        arr3.append("Tom")
        // 向数组的指定位置插入数据
        arr3.insert("Kate", at: 0)

        // 删除数组中指定位置的数据
        arr3.remove(at: 3)
        // 根据下标修改数据指定位置的数据
        arr3[0] = "Ann"

        // 使用for-in的方式遍历数组
        for e in arr3 {
            print(e)
        }
        // 使用下标的方式遍历数组
        for i in 0..<arr3.count {
            print(arr3[i])
        }
        // 使用enumerated()方法遍历数组,获得每个数据的索引值以及数据值
        for (index, value) in arr3.enumerated() {
            print("\(index): \(value)")
        }
        // 反序遍历数组
        for e in arr3.reversed() {
            print(e)
        }
        // 使用enumerated()方法反序遍历数组,获得每个数据的索引值以及数据值
        for (index, value) in arr3.enumerated().reversed() {
            print("\(index): \(value)")
        }

        // 获取数组的长度
        let lengthOfArray = arr3.count
        // 判断数组是否为空
        let result = arr3.isEmpty
        // 将数组中的值清空
        arr3.removeAll()
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,496评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,407评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,632评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,180评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,198评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,165评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,052评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,910评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,324评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,542评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,711评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,424评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,017评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,668评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,823评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,722评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,611评论 2 353

推荐阅读更多精彩内容