成长小计 - Swift小结

来源:互联网 发布:led光模拟软件 编辑:程序博客网 时间:2024/05/21 06:19

最近公司不忙,就抓紧学习了Swift, 因为本人发现越来越多的ios开发者用Swift写项目,趋势已经很明显,只是时间问题,现在将学习整理的笔记记录在博客里,其实个人感觉语法个不同点弄懂就可以了,框架和OC没啥大区别,一样的套路。

Swift是安全性极高的语言

1:简单值

let做常量  var做变量 ,常量值在编译的时候不需要知道,但是必须是精准的值,也就是说在初始化的时候进行赋值,可以被多次调用(等同于OC中的宏),它会根据初始化值进行判断,如无值时用冒号申明类型

let testInte = 70.0

var testDou: Double

值在转化为另一种类型时从不具有隐含性。如果需要转化值到另一种类型,明确性地为值进行格式转换。

String(width) \(apples)两种方式转换为String

1.2 整数范围

整数类型的 min max属性获取其最小值和最大值

1.3 类型别名

类型别名就是给一个类型定义的一个小名。通过 typealias关键字进行定义。

typealias testlias = UInt16  testlias 被定义为 UInt16 的一个别名

1.4 元祖

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

let http404Error = (404, "Not Found") 该元组是将一个 Int 类型值和一个 String类型值组合在一起

1.4.1 分解元组数据

let (Code, Message) = http404Error 赋值、分解

println("The status code is \(Code)")

println("The status message is \(Message)")

可以使用索引访问元组中的各个元素

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


1.4.2 如果你只需要一部分元组的值,忽略的部分用下划线(_)标记:

let (Code, _) = http404Error

注意:元组在临时组织值的时候很有用,但是并不适合创建复杂的数据结构。如果你的数据结构并不是临时使用,请使用类或者结构体

1.5:可选(Optionals)

Swift里不会自动给变量赋初始值,也就是说变量不会有默认值,如果在使用变量之前不进行初始化就会报错

1.5.1使用可选(optionals)来处理可能缺失值的情况

var age: String? 问号表示是可选的

// age自动得到默认值:nil

//这个nilObjective-C中的nil不同,不是指针,而是表示值不存在。

例如: String类型有一个方法 toInt,用于将一个 String 值转换成一个 Int

     字符串 "123" 可以被转换成数字123,但是"hello, world"是不行的。

如果定义一个可选常量或变量没有提供默认值,它们会被自动设置为nil

var test: String?

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

1.5.2 隐式强拆包类型(就是一种普通的可选)

使用!来声明变量,在调用时不需要使用?或!来说明。

声明一个隐式解析可选的方式是:把可选的类型的后面的问号(String?)改成感叹号(String!)。

let testString: String!

注意:如果一个变量值可能变成nil的话请不要使用隐式解析可选。如果你需要在变量的生命周期中判断是否是nil的话,请使用普通可选。



1.6  运算符

1.6.1  不同于 C Objective-CSwift中是可以对浮点数进行取余。

8 % 2.5  // 结果是 0.5

一元正号(-)可以切换

一元正号(+)不做任何改变的操作数的值。

let min = -6

let alsoMinusSix = +min  // 结果 -6


1.6.2  Swift 有两个区间运算符:闭区间运算符( a...b)和半闭区间 a..b 运算符

闭区间运算符(a...b):包含从 a b (包括 a b )之间的所有的值。

半闭区间运算符(a..b):定包含从 a b但不包括 b的区间内的所有的值


1.8  数组、字典

Array<SomeType>,或者简写为 SomeType[]

通过 []创建一个数组和字典,通过 index key获取对应的值

var shoppiNil = String[]() 空数组

var shoppingList = ["360", "特步", "唐狮", "nike"]

var shoppDictNil = Dictionary<key,value>()

var shoppingDict = ["360":"x123", "特步":"x234", "唐狮":"x345", "nike":"x456"]

1.8.1  数组基本属性用法

使用 isEmpty属性判断count是否为0

使用 append方法在数组尾部增加新的元素

使用数组的 insert (atIndex:)方法在 atIndex之前添加元素

使用 removeAtIndex方法来移除数组中的某一项

enumerate来进行数组遍历。enumerate返回一个由元素索引值和数据值组成的键值对

数组还提供了创建特定大小并且元素被同时初始化的构造器。把数组的元素数量(count)和初始值(repeatedValue)传入数组即可:

例:Double[](count: 3, repeatedValue: 0.0)

1.8.2 字典基本语法

updateValue(forKey:)方法可以添加或者更新 forKey对应的值。方法返回的是包含一个字典值类型的可选值

removeValueForKey 方法也可以用来从字典中移除键值对

keys或者 values属性(都是可遍历的集合)遍历字典的键或值:


2:函数

定义:func saySwift(personName: String) -> String {}

func关键字开头  (参数名:参数类型)   ->紧跟着的是返回值类型

// 注: switch支持任意类型的数据,不仅仅是整数类型不在需要break结尾

//  函数可以嵌套,被嵌套的函数可以访问外部函数变量

3:闭包

3.1.1

sort函数主要是对同一类型的数组值进行排序

sort 函数需要传入两个参数: sort(数组,闭包函数第二个参数(闭包函数): (String, String) -> Bool类型的闭包

闭包函数:需要传入与数组元素类型相同的两个参数值,并返回一个布尔值来告诉 sort函数传入的两个参数的顺序

内联闭包的sort

let reversed = sort(names, { (s1: String, s2: String) -> Bool in

    return s1 > s2

})

闭包表达式语法:函数和返回值类型都写在大括号内

{ ( parameters ) -> returntype  in

   return statements

}

内联闭包的函数体部分由关键字in引入


4:拷贝

字典中keysvalues值是值类型时,发生赋值操作,那这个字典就会被拷贝

1. var ages = ["Peter": 23, "Wei": 35, "Anish": 65, "Katya": 19]

2. var copiedAges = ages

拷贝行为:就是产生了两个单独的实例,但是初始内容是相同的

1. copiedAges["Peter"] = 24

2. println(ages["Peter"])

3. // 输出 "23" 与copiedAges是单独的两个实体,所以没有任何关系


2:数组比字典复杂,对数组来说,拷贝行为仅仅当操作有可能修改数组长度时才会发生

1. var a = [1, 2, 3]

2. var b = a

3. var c = a

无拷贝行为:就还只是一个实例,修改值会相应改变

a[0] = 42

println(a[0])  // 42

println(b[0]) // 42

println(c[0]) // 42


我们通过使用恒等运算符 ===来判定两个数组共用相同的储存空间或元素。

我们通过使用==运算符来判断两个字符串是否相同(取代OC中的isEqualToString

结束语:经过学习语法及不同点后,接下来我将把以前的OC项目用Swift写一篇,加强实战是最容易掌握这门语言的方法。我会记录下项目的进展及代码共享




0 0