swiftDay01笔记 --swift和OC的不同点 && swift的基础语法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了swiftDay01笔记 --swift和OC的不同点 && swift的基础语法相关的知识,希望对你有一定的参考价值。
1.创建对象 带圆括号
* OC: alloc initWithXXX 方法
* Swift: (xxx:)
//OC :
//UIView *view = [UIView alloc]init];
//Swift :
let view = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
2.方法调用 用点
* OC: [UIColor redColor];
* Swift UIColor.redColor()
3.枚举不一样,一个是以枚举的常量开头合成一个单词,一个是枚举的常量点后面的部分。
* OC: UIButtonTypeContactAdd
* Swift: UIButtonType.ContactAdd (button 的加号状态)
4.注释
* OC:
* Swift: 多行注释可以嵌套。
5.Bool类型
* C语言和OC并没有真正的Bool类型
* OC语言的Bool类型YES/NO是`typedef signed char BOOL;`非0即真
Swift引入了真正的Bool类型true/false
* Swift中没有C和OC中非零即真的概念
* Swfit中逻辑值只有两个true/false
* 如果你在需要使用Bool类型的地方使用了非布尔值,Swift 的类型安全机制会报错
swift语言新特性:
5.常量与变量
let
var
6.类型推断
7.类型安全(不能自动隐式转换(数据类型)(如int自动转换为double))
8.命名(除了数学符号,箭头,保留的(或者非法的)Unicode 码位,连线与制表符也不能以数字开头,但是可以在常量与变量名的其他地方包含数字以外,包括 Unicode 字符如????等)
9.元组(作为函数返回值时非常有用,取出元组值三种方式:1.下标2.指定元素名称3.分解元素)
10.流程控制结构(if/switch/for/while/dowhile) 许多注意点:
10.1 分支:
* if:只能以Bool作为条件语句,条件语句不需要加(),{}不能省略,Swift中if分支的模式可以使用where语句来判断额外的条件,其它和OCif一样
* 三目运算符:Swift中三目运算符用得很多
* 分支Switch:fallthrough(不会自动贯穿要贯穿必须用这个),OC中可以不写default,Swift中只有满足所有条件才能忽略default,OC中default位置可以随便放,Swift不可以,OC中在case中定义变量需要加大括号, 否则作用域混乱, Swift不用加大括号,Swift中的switch可以判断区间和元祖,Swift中case 分支的模式可以使用where语句来判断额外的条件(像if),Swift中每一个 case 分支都必须包含至少一条语句, 不像 C 语言里的switch语句,在 Swift 中,switch语句不会同时匹配多个条件
*
10.2 循环
* for循环-传统:for后的圆括号可以省略,只能以bool作为条件语句,如果只有一条指令for后面的大括号`不可以`省略,for后面的三个参数都可以省略, 如果省略循环保持语句, 那么默认为真
* for循环-Swift
闭区间: 包含区间内所有值 a...b 例如: 1...5
半闭区间: 包含头不包含尾 a..<b 例如: 1..<5
其它写法
Swift1.0版本写法 0..10
for i in 0..<10 {
print(i)
}
11.可选类型
Swift中只有可选类型才可以赋值为nil。
可选类型的取值是一个枚举( None 没有值, Some 有值)
*可选类型不能直接取出里面的值使用,需要解析出来,解析方法有:
*如果能确定一定有值的,通过 强制解包
*不能确定一定有值的就使用可选绑定(通过判断是不是有值,如果有值就使用否则return)
*当要使用的可选类型很多的时候,使用可选绑定写起来麻烦,使用 guard 它也是可选绑定的实现
*Swift经常使用可选类型,所以系统做了一个语法糖?:定义一个可选类型 number,原本的写法:
var number: Optional<Int>
number = 10
number = nil
语法糖:
var hmn: Int?
hmn = 2
hmn = nil
var number1: Int // (不使用可选类型不能给变量赋值nil)
number1 = 10
//number1 = nil
*隐式解析
/*
隐式解析可选类型(implicitly unwrapped optionals)
* 有时候在程序架构中,第一次被赋值之后,可以确定一个可选类型_总会_有值。在这种情况下,每次都要判断和解析可选值是非常低效的,因为可以确定它总会有值
* 隐式解析可选类型, 并不需要每次都使用解析来获取可选值, 一个隐式解析可选类型其实就是一个普通类型,但是可以被当做非可选类型来使用
* 格式: 将可选类型后面的?改为!
* let xmgButton: UIButton! (定义一个UIButton类型的变量xmgButton,它是一旦赋值就永远不为空的可选类型 可以直接把?给为!就是隐式解析)
注意:
* 如果一个变量之后可能变成nil的话请不要使用隐式解析可选类型。如果你需要在变量的生命周期中判断是否是nil的话,请使用普通可选类型
*/
//不使用隐式解析:(要写这么多(这里通过可选绑定,当然也可以用guard))
let intValue: Int?
intValue = 10
print(intValue)
print(intValue!)
if intValue != nil {
print(intValue!)
}
if let temp = intValue {
print(temp)
}
//使用隐式解析
var doubleValue: Double! //使用隐式解析 要保证doubleValue初始化后不再会为空了 如果还置为nil那么会报错,因为隐式解析是你告诉系统这个变量有值后不会再为空可以被系统自动解析出来。
doubleValue = nil
doubleValue = 3.14
print(doubleValue)
12.数组
12.1 可变不可变:swift中可变不可变数组都是array 看它可不可变看声明是let还是var
12.2 初始化再赋值,初始化同时赋值
12.3 遍历1遍历2、添加、删除、合并(通过区间拼接到想要的地方,通过元组拿到下标(索引)这个索引可以随便写)数组按照2的倍数来分配存储空间
//通过enumeration取得到数组的下标(索引,可以随便写)
for (xxx, ooo) in arr5.enumerate() {
print(xxx) //下标
print(ooo) //最后一个的值
}
//数组如何分配存储空间, 按照2的倍数来分配
var arr9 = [Int]() //快速创建空数组
arr9.capacity //打印数组容量
arr9.append(10)
arr9.capacity
arr9.append(11)
arr9.capacity
arr9.append(12)
arr9.capacity
arr9.append(13)
arr9.capacity
arr9.append(15)
arr9.capacity
13.数组
(类似数组)
*let 不可变字典,var 可变字典
*声明字典,初始化字典,定义空字典
*定义有值的字典
*[String : NSObject] 类型是做ios开发中最最常见的类型
*获取字典值
*增加( 只要字典中没有对应的key就会新增)
14.字符串
*OC语言中的字符串也是以\0结尾, Swift不是
* OC中字符串是一个对象, Swift中使用String是一个结构体,效率更高, 支持遍历
*值类型。 如果您创建了一个新的字符串,那么当其进行常量、变量赋值操作,或在函数/方法中传递时,会进行值拷贝。 任何情况下,都会对已有字符串值创建新副本,并对该新副本进行传递或赋值操作
操作1:拼接
操作2:插值
操作3:格式化
操作4:截取
let str3 = "com.520it.xmg"
// 截取xmg
// 注意: Swift中截取字符串的方法, 接收的参数和OC中不一样
// 前期, 为了大家开发方便, 建议转换为NSString之后再截取
// 转换
let str4 = str3 as NSString
let result2 = str4.substringFromIndex(10)
//Swift字符串中的 .startIndex ,用于获取字符串中第一个字符的位置
//Swift字符串中的 .endIndex, 用于获取字符串中最后一个字符串`下一位`的位置
let result3 = str3.substringFromIndex(str3.endIndex.advancedBy(-3))
let result4 = str3.substringFromIndex(str3.startIndex.advancedBy(10))
15.函数
参数返回值差异: 无返回值 写成() 或者()也可以不写
func say() -> Void { //不接受任何参数 返回值是Void 可以直接写为() 就是say1 当然->都可以省略 就是say2 任何函数最后都需要调用才能执行
print("hello")
}
say() // 执行函数
func say1() -> () {
print("hello")
}
say1()
// 推荐
func say2() {
print("hello")
}
say2()
内部外部参数
* 内部参数: Swift2.0以前, 默认情况下的参数都是内部参数
* Swift2.0开始, 默认将第二个参数名称作为外部参数 为了像OC一样长的像句子,阅读性更好,每个参数都明白什么意思,这是从第二个参数开始的 所以Swift也像这样。
* 如果没有明确地指定外部参数, 那么系统默认会从第二个参数开始, 将参数的名称作为外部参数
* 外部参数只能外部用, 函数内部不能使用, 函数内部只能使用内部参数
* 忽略外部参数: 在内部参数前加_
*/
// Swift2.0之前, 默认是不会将第二个参数开始的参数名称作为外部参数的, 必须自己手动指定 在参数前加# 后被废弃了(因为符合太多了)
func sum(i: Int, j: Int) { // 接收两个Int类型的参数,没有返回值
print(i + j)
}
sum(10, j: 20) // 从j开始,j就是外部参数 这个函数的外部参数省略了
func sum1(first i: Int, second j: Int) { //first 和second就是外部调用函数者看的 所以他们就是外部参数 i 和j就是内部参数
print(i + j)
}
sum1(first: 10, second: 20)
/*:
默认参数(Default Parameter Values)
* 格式: func method(parameter: Int = 0){}
* 当默认值被定义后,调用这个函数时可以忽略这个参数
* 其它语言的默认参数必须写在最后面, Swift可以写在任意位置
注意
* 将带有默认值的参数放在函数参数列表的最后。这样可以保证在函数调用时,非默认参数的顺序是一致的,同时使得相同的函数在不同情况下调用时显得更为清晰。
*/
func sum2(i: Int, j: Int = 10) { //定义了有参数无返回值的函数 第二个参数有默认值 假如调用时没有值就有默认值10
print(i + j)
}
//sum2(10, j: 20) 传值了 使用传入的值
sum2(10) //没有传值就使用默认值 打印20
// 可以吧默认参数不写最后 但是不推荐这样写, 最好将默认参数写在最后
func sum3(i: Int = 20, j: Int) {
print(i + j)
}
16.闭包
以上是关于swiftDay01笔记 --swift和OC的不同点 && swift的基础语法的主要内容,如果未能解决你的问题,请参考以下文章