swift语言入门介绍
2015-11-05 20:21
411 查看
1.
OC 的gcd、runtime是开源的,UIKIT是闭源的;
WWDC会议有对语言的新特性的讲解,维持一周,现在主推Swift语言。
2.
所有的声明和实现都在同一个文件中;
没有.h和.m文件。
3.
整数默认类型是int long
小数默认类型是double
(oc中的CGFloat 是单精度的)
数据的类型是自动推导的,能根据 ’=’ 右边的数据来确定具体的数据类型;
不同类型的数据无法直接进行计算,不支持隐含形式转换。
let修饰的数据一经赋值就不可修改,不可变。
var修饰的变量可变。
推荐使用let,安全,等需要修改的时候再改成var。
示例:
func
demo1 () {
var a = 10
a = 12
let
b:CGFloat
= 11.1
// b = 13 // b的值不可改变
let
c =
CGFloat(a) + b
print(c)
}
4. 可选项 ?
fatal 致命的
unwrapping 强制解包
运算符需要加空格分开。
func
demo1() {
/*
?表示可选类型,简单理解为“有吗?” 有值就是具体类型的值,没有就是nil。
打印可选项会带上
optaional。
常报错:
fatal error: unexpectedly found nil while unwrapping an Optional value
格式:var a: Int?
在使用强制解包的时候,可能会有风险。
如下示例,一旦a的值为nil,强制解包就会报错。
*/
var a:
Int? = 10
//
每使用‘!’
都要思考是否安全?
print(a!)
}
5.分支结构
条件不用再写圆括号( )
大括号{ }不能省略
在swift语言中没有非零即真的概念,只有true 和false,好处是不用担心忘写非!
如:不用担心if(!dataList) 中忘写’!’。
6.if let
if let 表示赋值,并且判断是否为空;
if
let
url =
NSURL(string: string){
let
request =
NSURLRequest(URL: url)
print(request)
}
7.guard let … else
示例:
func
demo4(){
let
string =
"http://www.baidu.com?username=zhang"
// guard let
可以减少嵌套,增强可读性
guard
let
url =
NSURL(string: string)
else{
// //
无法直接访问到url
// print(url)
return
}
//
程序走到这里一定有值
print(url)
}
8. ??
所有可选项都不能直接参与运算。
func
demo5(){
var
a: Int? = 10
// >>快速判断是否为空,并且设置默认值
//
实际运用在获取数据源的个数,用的非常多
//
??运算符优先级较低
print((a ?? -1) + 11)
}
9. switch 分支结构
/*
1. break可以省略;
2. case的条件中,至少有一段可以执行的代码,否则报错
3.
在
case 中定义变量,不需要加
{ }
4. case
的类型可以是任意类型,在c中只能是整型数据
5. case
可以同时case多个条件
*/
func demo6(){
let i =
"100"
switch i {
case
"100","120":
let str =
"花花"
print("花无缺")
case
"200":
print("小鱼儿")
default:
print("其他")
}
}
10.循环
/*
仿OC循环
1.循环的条件可以省略()
2.递增的变量不能使用let
*/
func demo1(){
for
var i = 0;i<10;i++ {
print(i)
}
}
// swift循环,不包含10
func demo2(){
for i
in 0..<10{
print(i)
}
}
//
循环
包含10
func demo3(){
for i
in 0...10{
print(i)
}
}
// _表示忽略
func demo4(){
for
_
in 0..<10{
print("Hello World")
}
}
11. 字符串
/*
OC
中的
NSString
继承自
NSObject
,是一个对象,效率略低,不支持遍历
SWIFT
中的
String是一个结构体,更加高效,支持遍历
*/
func demo1(){
let str =
"花无缺"
for s
in str.characters{
print(s)
}
// NSUTF8StringEncoding
是取字符编码的长度,中文的字符编码长度是3
let length = str.lengthOfBytesUsingEncoding(NSUTF8StringEncoding);
print(length)
//
打印结果是9
let
l = str.characters.count
print(l)
//
打印结果是3
}
func
demo2()
let
str1 =
"你若安好"
let str2 =
"便是晴天"
let str = str1 + str2
print(str)
print("\(str1)\(str2)")
let i:Int
= 10
print("\(i)便是晴天")
let j:Int? = 10
print("\(j)便是晴天")
}
/*
你若安好便是晴天
你若安好便是晴天
10便是晴天
Optional(10)便是晴天
*/
//
字符串的比较
func
demo3(){
let
str1 =
"ye"
let str2 =
"liang"
if
str1 == str2{
print("ai")
}else{
print("wo")
}
}
//
字符串和range
截取字符串
func demo4(){
//
将string
转换成NSString之后再去截取
let s1 =
"yuanlairuci"
let s2 = (s1
as
NSString).substringWithRange(NSMakeRange(4,
3))
print(s2)
}
========================
12.数组的基本操作
func
demo1() {
/*
1.数组中不建议存放不同类型的对象
2.let修饰的数组是不可变的
3.
*/
var arr = ["wo","ni","ta"]
for str
in arr{
print(str)
}
//
向数组中添加元素
arr.append("she")
print(arr)
//
修改元素
arr[0] =
"huawuque"
print(arr)
//
数组的删除
arr.removeAtIndex(2)
print(arr)
arr.removeFirst()
print(arr)
arr.removeLast()
print(arr)
arr.removeAll()
print(arr)
}
//
数组的拼接
func demo2() {
let arr1 = ["ni"]
let arr2 = ["wo"]
let arr = arr1 + arr2
print(arr)
}
13.字典的基本操作
//[key : value]键值对
func demo1() {
var dict = ["name":"fanbingbing","age":30]
//增加键值对
dict["title"]
=
"女神"
//
根据key修改value
dict["name"]
=
"linzhiling"
//删除
dict.removeValueForKey("age")
print(dict)
// swift字典的遍历,跟for后面(
)中的变量名无关;
// for (key,value) in dict{
for (a,b)
in dict{
print("key =
\(a)")
print("value =
\(b)")
}
}
/*
打印结果:
["title":
女神, "name": linzhiling]
key = title
value =
女神
key = name
value = linzhiling
*/
14.函数
/*
函数的基本格式
func
函数名(参数名:参数类型)
->返回值类型
*/
func sum(a:Int,
b:Int) ->Int{
return
a+b
}
/*
引入函数的外部参数
能够让外界调用,对函数的语义更加清晰,在函数内部使用更加简洁
*/
func area(height a:Int,
width b:Int) ->Int{
return
a*b
}
//函数没有返回值的三种写法
func demo1(str:
String) ->Void{
print(str)
}
func demo2(str:
String) ->(){
print(str)
}
func demo3(str:
String) {
print(str)
}
15.
oc中的block什么情况下会造成循环引用,闭包,怎么解决的?
__unsafe的风险。
16.
block是提前准备好
__weak一般在调用层进行添加,不在工具类Tool类添加。
17.按ESC可以补全没写全的方法
18.闭包的特点:
19.
/*
block(闭包)的特点:
1.提前准备好的一段可以执行的代码
2.block可以当做参数传递
3.在需要的时候执行block
4.在block中使用
self
有可能产生循环引用
20.block理解
a. 闭包和block都是作回调用的。
b. block、闭包回调是通过参数来传值。
c. 闭包中访问自己的方法,必须要加self。
d.
在block中访问self,会对外部变量做copy。
e. __weak weak 修饰的对象当被系统回收的时候,对象的地址会自动指向nil,给nil发送消息,在OC中是可以的,不会造成野指针访问,iOS5.0推出。
f. __unsafe_unretained
相当于assgin关键字,修饰的对象当被回收时,对象地址不会指向nil,iOS
4.0推出。
g. MRC
开发下最常见的错误之一:坏内存地址访问,俗称野指针访问。
h.
在异步方法中如果能直接执行block就直接执行,如果不需要立即执行;就需要用一个属性来记录block,在需要的时候执行。
i.
解决循环引用最终的一点:就是打破强引用循环。
j.
注意
:
循环引用,并没有那么容易出现。
k.
只有在有【成员变量】或者【属性】对外部的block
进行了记录,这时就需要考虑循环引用。
*/
21.
析构函数与 OC 的dealloc方法的作用是一致的。
22.
swift中的当发现一个对象为nil,不会给它发送任何消息;
而OC中会发送消息,但没有任何作用。
OC 的gcd、runtime是开源的,UIKIT是闭源的;
WWDC会议有对语言的新特性的讲解,维持一周,现在主推Swift语言。
2.
所有的声明和实现都在同一个文件中;
没有.h和.m文件。
3.
整数默认类型是int long
小数默认类型是double
(oc中的CGFloat 是单精度的)
数据的类型是自动推导的,能根据 ’=’ 右边的数据来确定具体的数据类型;
不同类型的数据无法直接进行计算,不支持隐含形式转换。
let修饰的数据一经赋值就不可修改,不可变。
var修饰的变量可变。
推荐使用let,安全,等需要修改的时候再改成var。
示例:
func
demo1 () {
var a = 10
a = 12
let
b:CGFloat
= 11.1
// b = 13 // b的值不可改变
let
c =
CGFloat(a) + b
print(c)
}
4. 可选项 ?
fatal 致命的
unwrapping 强制解包
运算符需要加空格分开。
func
demo1() {
/*
?表示可选类型,简单理解为“有吗?” 有值就是具体类型的值,没有就是nil。
打印可选项会带上
optaional。
常报错:
fatal error: unexpectedly found nil while unwrapping an Optional value
格式:var a: Int?
在使用强制解包的时候,可能会有风险。
如下示例,一旦a的值为nil,强制解包就会报错。
*/
var a:
Int? = 10
//
每使用‘!’
都要思考是否安全?
print(a!)
}
5.分支结构
条件不用再写圆括号( )
大括号{ }不能省略
在swift语言中没有非零即真的概念,只有true 和false,好处是不用担心忘写非!
如:不用担心if(!dataList) 中忘写’!’。
6.if let
if let 表示赋值,并且判断是否为空;
if
let
url =
NSURL(string: string){
let
request =
NSURLRequest(URL: url)
print(request)
}
7.guard let … else
示例:
func
demo4(){
let
string =
"http://www.baidu.com?username=zhang"
// guard let
可以减少嵌套,增强可读性
guard
let
url =
NSURL(string: string)
else{
// //
无法直接访问到url
// print(url)
return
}
//
程序走到这里一定有值
print(url)
}
8. ??
所有可选项都不能直接参与运算。
func
demo5(){
var
a: Int? = 10
// >>快速判断是否为空,并且设置默认值
//
实际运用在获取数据源的个数,用的非常多
//
??运算符优先级较低
print((a ?? -1) + 11)
}
9. switch 分支结构
/*
1. break可以省略;
2. case的条件中,至少有一段可以执行的代码,否则报错
3.
在
case 中定义变量,不需要加
{ }
4. case
的类型可以是任意类型,在c中只能是整型数据
5. case
可以同时case多个条件
*/
func demo6(){
let i =
"100"
switch i {
case
"100","120":
let str =
"花花"
print("花无缺")
case
"200":
print("小鱼儿")
default:
print("其他")
}
}
10.循环
/*
仿OC循环
1.循环的条件可以省略()
2.递增的变量不能使用let
*/
func demo1(){
for
var i = 0;i<10;i++ {
print(i)
}
}
// swift循环,不包含10
func demo2(){
for i
in 0..<10{
print(i)
}
}
//
循环
包含10
func demo3(){
for i
in 0...10{
print(i)
}
}
// _表示忽略
func demo4(){
for
_
in 0..<10{
print("Hello World")
}
}
11. 字符串
/*
OC
中的
NSString
继承自
NSObject
,是一个对象,效率略低,不支持遍历
SWIFT
中的
String是一个结构体,更加高效,支持遍历
*/
func demo1(){
let str =
"花无缺"
for s
in str.characters{
print(s)
}
// NSUTF8StringEncoding
是取字符编码的长度,中文的字符编码长度是3
let length = str.lengthOfBytesUsingEncoding(NSUTF8StringEncoding);
print(length)
//
打印结果是9
let
l = str.characters.count
print(l)
//
打印结果是3
}
func
demo2()
let
str1 =
"你若安好"
let str2 =
"便是晴天"
let str = str1 + str2
print(str)
print("\(str1)\(str2)")
let i:Int
= 10
print("\(i)便是晴天")
let j:Int? = 10
print("\(j)便是晴天")
}
/*
你若安好便是晴天
你若安好便是晴天
10便是晴天
Optional(10)便是晴天
*/
//
字符串的比较
func
demo3(){
let
str1 =
"ye"
let str2 =
"liang"
if
str1 == str2{
print("ai")
}else{
print("wo")
}
}
//
字符串和range
截取字符串
func demo4(){
//
将string
转换成NSString之后再去截取
let s1 =
"yuanlairuci"
let s2 = (s1
as
NSString).substringWithRange(NSMakeRange(4,
3))
print(s2)
}
========================
12.数组的基本操作
func
demo1() {
/*
1.数组中不建议存放不同类型的对象
2.let修饰的数组是不可变的
3.
*/
var arr = ["wo","ni","ta"]
for str
in arr{
print(str)
}
//
向数组中添加元素
arr.append("she")
print(arr)
//
修改元素
arr[0] =
"huawuque"
print(arr)
//
数组的删除
arr.removeAtIndex(2)
print(arr)
arr.removeFirst()
print(arr)
arr.removeLast()
print(arr)
arr.removeAll()
print(arr)
}
//
数组的拼接
func demo2() {
let arr1 = ["ni"]
let arr2 = ["wo"]
let arr = arr1 + arr2
print(arr)
}
13.字典的基本操作
//[key : value]键值对
func demo1() {
var dict = ["name":"fanbingbing","age":30]
//增加键值对
dict["title"]
=
"女神"
//
根据key修改value
dict["name"]
=
"linzhiling"
//删除
dict.removeValueForKey("age")
print(dict)
// swift字典的遍历,跟for后面(
)中的变量名无关;
// for (key,value) in dict{
for (a,b)
in dict{
print("key =
\(a)")
print("value =
\(b)")
}
}
/*
打印结果:
["title":
女神, "name": linzhiling]
key = title
value =
女神
key = name
value = linzhiling
*/
14.函数
/*
函数的基本格式
func
函数名(参数名:参数类型)
->返回值类型
*/
func sum(a:Int,
b:Int) ->Int{
return
a+b
}
/*
引入函数的外部参数
能够让外界调用,对函数的语义更加清晰,在函数内部使用更加简洁
*/
func area(height a:Int,
width b:Int) ->Int{
return
a*b
}
//函数没有返回值的三种写法
func demo1(str:
String) ->Void{
print(str)
}
func demo2(str:
String) ->(){
print(str)
}
func demo3(str:
String) {
print(str)
}
15.
oc中的block什么情况下会造成循环引用,闭包,怎么解决的?
__unsafe的风险。
16.
block是提前准备好
__weak一般在调用层进行添加,不在工具类Tool类添加。
17.按ESC可以补全没写全的方法
18.闭包的特点:
19.
/*
block(闭包)的特点:
1.提前准备好的一段可以执行的代码
2.block可以当做参数传递
3.在需要的时候执行block
4.在block中使用
self
有可能产生循环引用
20.block理解
a. 闭包和block都是作回调用的。
b. block、闭包回调是通过参数来传值。
c. 闭包中访问自己的方法,必须要加self。
d.
在block中访问self,会对外部变量做copy。
e. __weak weak 修饰的对象当被系统回收的时候,对象的地址会自动指向nil,给nil发送消息,在OC中是可以的,不会造成野指针访问,iOS5.0推出。
f. __unsafe_unretained
相当于assgin关键字,修饰的对象当被回收时,对象地址不会指向nil,iOS
4.0推出。
g. MRC
开发下最常见的错误之一:坏内存地址访问,俗称野指针访问。
h.
在异步方法中如果能直接执行block就直接执行,如果不需要立即执行;就需要用一个属性来记录block,在需要的时候执行。
i.
解决循环引用最终的一点:就是打破强引用循环。
j.
注意
:
循环引用,并没有那么容易出现。
k.
只有在有【成员变量】或者【属性】对外部的block
进行了记录,这时就需要考虑循环引用。
*/
21.
析构函数与 OC 的dealloc方法的作用是一致的。
22.
swift中的当发现一个对象为nil,不会给它发送任何消息;
而OC中会发送消息,但没有任何作用。
相关文章推荐
- MySQL中的integer 数据类型
- 介绍一款信息管理系统的开源框架---jeecg
- 源码被倒卖,大厂薅羊毛,开源真的只能被予取予求?
- 专家解读:开源软件项目是否会被限制出口?
- MySQL 数据类型
- Apple Swift学习教程
- 专家解读:开源软件项目是否会被限制出口?
- fuse-dfs的设定手册
- Centos下***(pptpd)的部署
- PostgreSQL教程(四):数据类型详解
- Lua学习笔记之数据类型
- 实现Lua中数据类型的源码分享
- Lua数据类型介绍
- SQL 研究 相似的数据类型
- 详解SQLite中的数据类型
- PowerShell中使用GetType获取变量数据类型
- c# 数据类型占用的字节数介绍
- C#难点逐个击破(6):C#数据类型与.net framework数据类型