相信很多新手开始学习Swift的时候都会有点无所适从,下面总结了一些初学者需要了解和注意的地方供大家参考和学习.
一.与OC的差别
1.程序入口:AppDelegate里面的UIApplicationMain
2.创建一个类只创建一个文件以.swift结尾
3.OC以@interface开始@end结束Swift以大括号{}开始和结束
4.OC一行代码以;结束swift以换行结尾没有分号(但加分号之后也不报错)
二.创建对象
1..OC创建视图(对象)用alloc init swift采用()来创建对象
2.OC采用initWithxxx swift采用(xxx:)
3.修改背景颜色[UIcolor redColor] swift里面UIcolor.redColor
4.=左右两边都要有空格
5.Oc添加视图self.view addsubview swift里可以不写self但写了也不报错(有一个地方进行比较----闭包)
6.Oc里枚举是全的swift中采用类型.样式的形式
7.Oc打印NSlog swift中得枚举可以直接省略前面的类型(注意:省略类型后,后面的提示有时候不好) print执行效率比Nslog高
8.打印print(已经可以直接换行,从网上搜得好多资料说println才能换行,print不能,应该是之前的版本,swift2.0已经修改了)
同时注意print的使用:print("\(变量)")
三.swift语法
1.let定义常量赋值之后不能改变
2.var定义变量
注意:
1>swift里的自动推导:变量/常量依据等号右边的值自动推导出变量/常量的类型
2>查看类型optional + click
3>不同类型之间不能直接运算(ocint+ folat有隐式转换,会将低精度的int自动转为float 但是,swift只有强制转换)
强制转换两种方式:1.不采用自动推导--->在变量名后面指定类型let a:Double =10
2.采用 类型(变量名)实现强制转换
letnumber =10
letnum =Double(number)
print(num)//10.0
建议优先定义let,如果有需要,再改成var
四.可选项
1.可选项有可能有值,也有可能没有值
2.可选项不能直接运算若要直接运算的话,需要强制解包
3.可选项是swift特有的.
4.什么是可选项?在变量/常量后面加一个?就是一个可选项.
leta :Int? =10(常量的可选项必须赋值,否则后面打印也会报错)
ler.swift:21:15: Constant 'a' used before being initialized--->初始化之前就使用了
5.可选项的默认值为nil
6.强制解包在可选项后面加!就是强制解包(注意!前面没有空格)
7.强制解包存在一定的风险
8.报错
unexpectedly found nil while unwrapping an Optional value
强行解包的变量没有值,就会报此错误,因此一定要考虑清楚是否能够直接进行强制解包
9.苹果为我们提供了一种新的方式: ??
??会判断你前面的可选项是否为nil若为nil则取??后面的值若不为nil则对??前面的可选项进行解包操作
示例:
//可选项变量值为nil,??取后面的值
varnumber :Int?
letresult = (number ??0) +5
print(result)//打印结果为5
//可选项变量的值不为nil,取??前可选项解包后的值
varnumber1 :Int? =10
letresult1 = (number1 ??0) +5
print(result1)//打印结果为15
五.if语句
command+波浪线切换工程
Oc里面有非零即真概念
1.swift没有非零即真的概念
2.if后面的()可以省略
3.但是{}不可以省略
4.三目运算符a?(b):(c)三目运算符在oc和swift里面一样
示例:
//1.if
leta =10
ifa >=10{
print("\(a)")
}elseifa <19{
print("111")
}
//2.三目运算
letb =10
letc =20
letd = b > c ? b : c
print("\(d)")
六.if let语法
1.用于判断可选项
iflet新的变量名=可选项{
新变量名的作用域:新变量名不是可选项
}
若新变量名有值(对可选项进行的一个解包),则运行if后面{}的值;
若新变量名没有值则不执行
多个变量判断,用逗号隔开.
2.iflet后面可以加where条件判断语句,用于判断新变量名是否符合要求;注意where后面没有智能提示
多个变量用,分开进行判断
示例:
leturlStr ="www.baidu.com"
leturl =NSURL(string: urlStr)
//if let语句,若新变量不为nil,则执行{}
ifletoUrl = url{
letrequest =NSURLRequest(URL: oUrl)
print(request)
}
七.guard let
1.guard let与iflet相反
guard let新变量名=可选项else{
return
}
新变量名的作用域
若新变量有值则不运行else后面{}里的代码
若新变量名没有值,(可选项为nil)则运行else后面{}的代码
多个变量可以用,隔开,只有两个变量都有值才走后面的代码
示例:
leturlStr ="www.baidu.com"
leturl =NSURL(string: urlStr)
//guard let语句,若新变量为nil,则执行{},不为nil则执行{}后面的语句
guardletoUrl = urlelse{
return
}
letrequest =NSURLRequest(URL: oUrl)
print(request)
八.switch
oc中只能为常量
1.swift不仅局限于整型,字符串等其他类型
2.case后面可以不加break但是必须要有一条可执行的语句
3.当switch把所有的情况到考虑到的时候(例如:枚举的类型),可以省略default(没考虑到必须加)
示例一:
//switch语句
letscore =89
switchscore/10{
case6:
break
case7:
print("及格")
case8:
print("良好")
case9:
break
default:
break
}
示例二:
//定义一个枚举的类型
enumScoreType:String{
caseTypeGood ="优"
caseTypeMiddle ="良好"
}
//定义一个变量
lettype :ScoreType= .TypeGood
//用switch(里面的case为枚举的两种类型,因为考虑到了全部的两种情况,所以可以不写default)
switchtype{
case.TypeGood:
print("优")
case.TypeMiddle:
print("良好")
}
九.for循环
1.for iint0...10{
print(i)//打印0到10共11个
}
2.for iint0..<10{
print(i)//打印0到9共10个
}
系统检测到let a没有被使用建议改为_这个_可以理解为忽略
十.字符串string类型
1.NSSring继承自NSObject的对象swift中String是结构体(运行效率高一点)
2.可以相互转换
一个中文占3个字节
3.字符串拼接
1> +(加号)拼接
2>print("\(str)便是晴天")"\(变量名)拼接的内容"
4.格式化字符串string(format:...)
示例:
//格式化字符串
leth =05
letm =06
lets =07
letstr1 =String(format:"%02d:%02d:%02d", arguments: [h,m,s])
print(str1)//打印结果:05:06:07
5.截取字符串:swift的截取字符串使用起来并没有OC的灵活和方便,所以可以将String转化为NSString来进行字符串的截取
示例:
//截取字符串swift风格的
//str = "你若安好,便是晴天"
letstartIndex = str.startIndex
letendIndex ="123".endIndex//此处的123为占位符(即换为任意的字符都可以,只是用来计算长度的)
letsubStr = str.substringWithRange(startIndex..
print(subStr)//打印结果:你若安
//截取字符串OC风格的
letsubStr1 = (strasNSString).substringWithRange(NSMakeRange(0,5))
print(subStr1)//打印结果:你若安好,
十一.集合:数组字典
一)数组用[]存放
2.let定义数组不可变var定义的数组可变
3.只能添加相同数据类型
4.若要添加不同类型强制指定为NSObject(oc的)也可以AnyObject(协议)[swift的]
ps:NSObject的父类也是一个协议
5.数组初始化[类型]()
6.合并数组+
注意:只能对相同类型的数组才能合并.
7.删除数据
1>removeAll ------>删除后内存没有了
2>removeAll(keepCapacity:true)-->删除后内存还在
3>removeFirst/AtIndex删除第一个/指定元素
4>let value result[3]获取指定索引的数据
示例:
//数组
//新建一个数组并指定其元素的类型
vararray = [1,2,3,4,5]
//追加元素
array.append(6)
//打印结果
print(array)//打印结果[1, 2, 3, 4, 5, 6]
//新建一个数组并指定其元素的类型
vartemp: [AnyObject] = [AnyObject]()
//追加元素
temp.append("你若安好")
vartemp1:[AnyObject] = [AnyObject]()
temp1.append("便是晴天")
temp1.append(0)
//数组的合并相同类型的数组可以直接用+来实现
varresult = temp + temp1
print(result)//打印结果:[你若安好,便是晴天]
//不同类型的数组可以遍历其中一个来实现
forvalueinarray {
result.append(value)
}
print(result)//打印结果:[你若安好,便是晴天, 1, 2, 3, 4, 5, 6]
//删除数组的元素
result.removeFirst()
print(result)//打印结果:[便是晴天, 1, 2, 3, 4, 5, 6]
//删除全部元素
//对于打印结果的说明:在64之前,打印的是8的指数,例如有3个元素,打印8;有10个元素,打印16,但超过之后就没有规律了
print(result.capacity)//打印结果8
//数组名.removeAll(keepCapacity: true),
//此处为true,则删除所有的数据之后,内存还保留
//此处为false,则删除所有的数据之后,内存不再进行保留
result.removeAll(keepCapacity:true)
print(result.capacity)//打印结果:8
result.removeAll()
print(result.capacity)//打印结果:0
二)字典
1.键值对["key": value](key一般是string value不一定)
2.可变字典var ;不可变字典let
3.添加数据字典名["name"] ="it"
4.若key值不存在直接添加数据;若key已经存在,则赋值会替换原来的值.
5.若想删除字典的某一个key值,直接给key的值赋为nil就可以了.
6.若指定了字典的值的类型,必须是相同的类型才能赋值.想给字典添加其他的数据类型,需要在初始化的时候指定value的值的类型为AnyObject
7.对字典进行遍历fordicinnewDict{
print(dic)
}
8.字典的合并
把dict合并到newDict-->遍历dict,将其元素添加到newDict
示例:
//新建一个字典["key":value]
vardict = ["key":"value"]
//给字典赋值,若key不存在,则直接添加
dict["name"] ="果而"
print(dict)//打印结果:["key": "value", "name": "果而"]
//给字典赋值,若key存在,则会覆盖原来的值
dict["name"] ="贝尔"
print(dict)//打印结果:["key": "value", "name": "贝尔"]
//若想要删除字典的元素,则将key对应的value设置为nil即可
dict["name"] =nil
print(dict)//打印结果:["key": "value"]
//若要给字典添加不同类型的元素,需要将字典设置类型
varnewDict:[String:AnyObject] = [String:AnyObject]()
newDict["name"] ="史努比"
newDict["age"] =2
print(newDict)//打印结果:["age": 2, "name":史努比]
//字典的合并,遍历一个字典,将其元素添加到另一个字典中
//字典的遍历(注意key和value只是一个占位符)
for(key,value)indict{
print("字典的key为:\(key),value为:\(value)")
}
//字典的合并
for(key,value)indict{
newDict[key] = value
}
print(newDict)//打印结果为:["age": 2, "key": value, "name":史努比]
十二.函数
1.函数的格式: func函数名(参数名1:参数类型,...) ->返回值类型{函数的代码}
2.函数的参数说明
3.函数的返回值
大部分函数返回值为空swift有3种返回值为空的形式
示例:
//函数
//第一个参数只是一个标记,在给函数参数的时候的提示
funcsum(第一个参数num1:Int, num2:Int) ->Int{
returnnum1 + num2
}
//函数返回值为空的三种写法
funcdemo1(){
print("返回值为空")
}
funcdemo2() ->(){
print("返回值为空")
}
funcdemo3() ->Void{
print("返回值为空")
}