Swift笔记
2015-11-22 15:37
495 查看
一 . 开发中 推荐使用 let 因为let 更加安全,等需要修改的时候,再改成var
let: 表示常量 一经赋值 就不能被修改,不可变
var: 表示变量 可变
在swift 中 数据的类型就是自动推导 根据 ‘=‘ 右边 来确定数据的具体类型
swift 是一个类型校验 非常严格的语言
整数默认类型是 Int long
小数的默认类型 是 Double 双精度 CGFloat 单精度
不同类型的数据,无法直接进行计算 不支持隐含形式转换
代码:
func
demo() {
let
a = 10
// a = 20
var
b: CGFloat
= 20.5
b = 10.5
let
c = CGFloat(a) + b
print(c)
}
二 . Switch 分支结构
1. break 可以省略(没有贯穿的问题)
2. case的每一条件 必须至少有一段可以执行的代码
3. 在case中,定义变量, 不需要加{} (OC必须加)
4. case的类型 可以是任意类型 (OC只能是整数类型)
5.可以同时case 多个条件
代码:
func
demo6() {
let
i = "16000"
switch
i {
case
"18000"
,"16000":
let
str =
"出任ceo"
print("高级工程师")
case
"12000":
print("中级工程师")
case
"8000":
print("初级g工程师")
default:
print("码农")
}
}
三.??
?? 快速判断是否为空,并且 设置为空默认值
实际运用 在获取数据源的个数 用的非常多
所有可选项 都不能直接参与运算
运算符优先级 低
func demo5() {
// var a: Int? = 10
//
// print((a ?? -1) + 20)
// }
四.guard let… else 守卫
func
demo4() {
let ulstring =
"http://www.douniwan.com
guard
let url =
NSURL(string: ulstring)
else {
//程序走到这里说明url肯定是没有值的 guard 里面的代码肯定没有值才能进来的
return
}
//程序走到这里
url
一定有值
print(url)
}
五. if let 表示 赋值 并且判断是否为空
func
demo3() {
//1. urlString
let ulstring =
"http://www.douniwan.com?type"
//2.url
// let url = NSURL(string: ulstring)
//// print(url)
// //request
// if url != nil {
// let request = NSURLRequest(URL: url!)
// print(request)
// }
if
let url =
NSURL(string: ulstring) {
//程序能够走到这个分支
就表示
url一定有值
let request =
NSURLRequest(URL: url)
}
//4.网络请求
}
六. 分支结构
1. if 条件: 没有()
2. {} 不能省略
3. 在swift 中没有 ,没有非零既真的概念
只有 true /false
以后再也不不用担心! 忘写了
代码:
func
demo2() {
let
i = 10
if
i > 0
{
print("大于0")
} else
{
print("小于0")
}
}
七.可选项 ?
?: 可选类型 有吗? 有值 就是具体类型的值,没有值 是nil
打印可选项 会带上 optaional
!: 有 !!!
fatal(致命的)
error: unexpectedly found nil while unwrapping(强制解包) an
Optional value
使用强制解包的时候 可能会有风险
func
demo1() {
var a:
Int?
//每使用
'!'都需要思考
这样
安全吗
if (a !=
nil) {
print(a!)
}
}
八.NSString 继承 NSObject 效率低 不支持遍历
swift: string 是结构体 更加效率高效, 支持遍历
代码:
class
ViewController:
UIViewController {
override
func
viewDidLoad() {
super.viewDidLoad()
demo2()
}
//字符串的拼接
func demo2() {
let
str1 = "你若安好"
let
str2 = "便是晴天"
let
str = str1 + str2
// print(str)
//另外一种拼接方式 \()
转译字符串
let i:Int? =
10
print("\(i)\(str2)")
//NSString stringWithFormat:@"%@%@" ,"忘了他吧"
}
//定义字符串
func demo1() {
let
str: String
= "良辰必有重谢"
for
s in
str.characters
{
print(s)
}
//字符串的长度
//lengthOfBytesUsingEncoding
取 字符编码的长度
中文字符编码长度
= 3
let l = str.lengthOfBytesUsingEncoding(NSUTF8StringEncoding)
print(l)
let
l1 = str.characters.count
print(l1)
}
}
九.截取字符串
//字符串和range
截取子串
func demo4() {
//将
String
转换成 NSString
再去截取子串
let
str = "听说下雨天,美女,炸鸡,啤酒更加配哦"
//as
转换类型
let substr = (str
as NSString).substringFromIndex(1)//截取的是从第一个开始的全部字
let subset = (str
as NSString).substringWithRange(NSMakeRange(0,
1))//第一个参数代表的是位置,,第二个参数代表的是长度进行截取
let subStr = (str
as NSString).substringToIndex(1)//截取的是字
print(subStr)
}
十.字符串的比较
//字符串的比较
func demo3() {
let
str = "你还是把地扫了"
let
str1 = "叶良成"
if
str == str1 {
print("血雨腥风")
} else
{
print("算了")
}
}
十一.字符串拼接
//字符串的拼接
func demo2() {
let
str1 = "你若安好"
let
str2 = "便是晴天"
let
str = str1 + str2
// print(str)
//另外一种拼接方式 \()
转译字符串
let i:Int? =
10
print("\(i)便是晴天")
//NSString stringWithFormat:@"%@%@" ,"忘了他吧"
}
十二.数组的定义以及数组的拼接
//数组的拼接
func demo1() {
let
arr1 = ["范冰冰","李冰冰"]
let
arr2 = ["凤姐","刘亦菲"]
let
arr = arr1 + arr2
// print("\(arr1)\(arr2)")
print(arr)
}
十三.数组的遍历,,增加,删除,
//数组中不建议存放类型不行同的对象
var arr = ["范冰冰","李冰冰","凤姐"]
//数组的遍历
for str
in arr {
print(str)
}
//向数组中添加元素
arr.append("刘亦菲")
print(arr)
//修改元素
arr[0] =
"章子怡"
十四.字典的遍历,增加,删除,修改
//字典的定义
func demo() {
var dict = ["name":"李冰冰","age":30]
//增加键值对
dict["title"]
=
"女神"
//根据key
修改value
dict["name"]
=
"林志玲"
//删除
dict.removeValueForKey("age")
print(dict)
//字典的遍历
//(key,value)
for (a, b)
in dict {
print("key =
\(a)")
print("value =
\(b)")
}
}
//数组的删除
arr.removeFirst()//删除第一个
arr.removeLast()//删除最后一个
// arr.removeAll()//删除全部
十五.函数的定义,以及调用
//调用
//第一个参数名
可以被省略
let result =
sum(10, b:
100)
print(result)
let
result1 = area(height:
10, width:
20)
print(result1)
demo("哈哈")
demo1("嘻嘻")
demo2("呵呵")
}
//函数的基本格式
// func 函数名(参数名:
参数类型) ->
返回值类型
func sum(a:
Int, b:
Int) ->
Int {
return
a + b
}
//函数没有返回值的三种写法
//第一种写法 Void
func demo(str:
String) ->
Void {
print(str)
}
// 2.()
func demo1(str:
String) -> () {
print(str)
}
//3.
什么都没有
func demo2(str:
String) {
print(str)
}
//函数的外部参数
//1.能够让外界调用
对函数的语义更加清晰
//2.在函数内部
使用
更加简洁
func area(height a:
Int, width b:
Int) ->
Int {
return
a * b
}
什么时候会出现block 和 swift的闭包的循环引用
只有在block内部的属性对外部的block进行了一次self的保存,这时候就应该考虑循环引用了
解决方法有:
block的解决方法
1. __weak
typeof(self)
weakSelf =
self;
让一方进行weak
2. __unsafe_unretained typeof(self) weakSelf = self
闭包的解决方法:
一.
//(data) -> ()
闭包的定义 in(闭包的定义
和
执行代码的间隔 )
可执行代码
//第二种解决循环引用的方法
//unowned self
对象被回收时
不会自动指向 nil
会有风险
坏地址访问
野指针
//assgin 作用是一样的 -> unsafe_unretained
loadData {[unowned
self] (data) -> ()
in
print(data)
//使用
?
如果是nil
就不会做任何操作
print(self.view)
}
二.
func method1() {
//swfit
解决循环引用
//weak
有一个机会
会指向
nil
//[weak self]
表示闭包中访问所有的
self
都是弱引用的
//weak
作用是一样的 ->__weak
loadData
{[weak
self] (data) -> ()
in
print(data)
//使用
?
如果是nil
就不会做任何操作
print(self?.view)
}
}
func
methodOC() {
//(data) -> ()
闭包的定义 in(闭包的定义
和
执行代码的间隔 )
可执行代码
//OC的解决办法
定义weak self类型
//weak 有一个机会
会指向
nil
weak var
weakSelf = self
loadData
{ (data) -> ()
in
print(data)
//使用
?
如果是nil
就不会做任何操作
print(weakSelf?.view)
}
}
闭包:
()->()
(闭包的参数)->(闭包的类型)可执行的代码
let: 表示常量 一经赋值 就不能被修改,不可变
var: 表示变量 可变
在swift 中 数据的类型就是自动推导 根据 ‘=‘ 右边 来确定数据的具体类型
swift 是一个类型校验 非常严格的语言
整数默认类型是 Int long
小数的默认类型 是 Double 双精度 CGFloat 单精度
不同类型的数据,无法直接进行计算 不支持隐含形式转换
代码:
func
demo() {
let
a = 10
// a = 20
var
b: CGFloat
= 20.5
b = 10.5
let
c = CGFloat(a) + b
print(c)
}
二 . Switch 分支结构
1. break 可以省略(没有贯穿的问题)
2. case的每一条件 必须至少有一段可以执行的代码
3. 在case中,定义变量, 不需要加{} (OC必须加)
4. case的类型 可以是任意类型 (OC只能是整数类型)
5.可以同时case 多个条件
代码:
func
demo6() {
let
i = "16000"
switch
i {
case
"18000"
,"16000":
let
str =
"出任ceo"
print("高级工程师")
case
"12000":
print("中级工程师")
case
"8000":
print("初级g工程师")
default:
print("码农")
}
}
三.??
?? 快速判断是否为空,并且 设置为空默认值
实际运用 在获取数据源的个数 用的非常多
所有可选项 都不能直接参与运算
运算符优先级 低
func demo5() {
// var a: Int? = 10
//
// print((a ?? -1) + 20)
// }
四.guard let… else 守卫
func
demo4() {
let ulstring =
"http://www.douniwan.com
guard
let url =
NSURL(string: ulstring)
else {
//程序走到这里说明url肯定是没有值的 guard 里面的代码肯定没有值才能进来的
return
}
//程序走到这里
url
一定有值
print(url)
}
五. if let 表示 赋值 并且判断是否为空
func
demo3() {
//1. urlString
let ulstring =
"http://www.douniwan.com?type"
//2.url
// let url = NSURL(string: ulstring)
//// print(url)
// //request
// if url != nil {
// let request = NSURLRequest(URL: url!)
// print(request)
// }
if
let url =
NSURL(string: ulstring) {
//程序能够走到这个分支
就表示
url一定有值
let request =
NSURLRequest(URL: url)
}
//4.网络请求
}
六. 分支结构
1. if 条件: 没有()
2. {} 不能省略
3. 在swift 中没有 ,没有非零既真的概念
只有 true /false
以后再也不不用担心! 忘写了
代码:
func
demo2() {
let
i = 10
if
i > 0
{
print("大于0")
} else
{
print("小于0")
}
}
七.可选项 ?
?: 可选类型 有吗? 有值 就是具体类型的值,没有值 是nil
打印可选项 会带上 optaional
!: 有 !!!
fatal(致命的)
error: unexpectedly found nil while unwrapping(强制解包) an
Optional value
使用强制解包的时候 可能会有风险
func
demo1() {
var a:
Int?
//每使用
'!'都需要思考
这样
安全吗
if (a !=
nil) {
print(a!)
}
}
八.NSString 继承 NSObject 效率低 不支持遍历
swift: string 是结构体 更加效率高效, 支持遍历
代码:
class
ViewController:
UIViewController {
override
func
viewDidLoad() {
super.viewDidLoad()
demo2()
}
//字符串的拼接
func demo2() {
let
str1 = "你若安好"
let
str2 = "便是晴天"
let
str = str1 + str2
// print(str)
//另外一种拼接方式 \()
转译字符串
let i:Int? =
10
print("\(i)\(str2)")
//NSString stringWithFormat:@"%@%@" ,"忘了他吧"
}
//定义字符串
func demo1() {
let
str: String
= "良辰必有重谢"
for
s in
str.characters
{
print(s)
}
//字符串的长度
//lengthOfBytesUsingEncoding
取 字符编码的长度
中文字符编码长度
= 3
let l = str.lengthOfBytesUsingEncoding(NSUTF8StringEncoding)
print(l)
let
l1 = str.characters.count
print(l1)
}
}
九.截取字符串
//字符串和range
截取子串
func demo4() {
//将
String
转换成 NSString
再去截取子串
let
str = "听说下雨天,美女,炸鸡,啤酒更加配哦"
//as
转换类型
let substr = (str
as NSString).substringFromIndex(1)//截取的是从第一个开始的全部字
let subset = (str
as NSString).substringWithRange(NSMakeRange(0,
1))//第一个参数代表的是位置,,第二个参数代表的是长度进行截取
let subStr = (str
as NSString).substringToIndex(1)//截取的是字
print(subStr)
}
十.字符串的比较
//字符串的比较
func demo3() {
let
str = "你还是把地扫了"
let
str1 = "叶良成"
if
str == str1 {
print("血雨腥风")
} else
{
print("算了")
}
}
十一.字符串拼接
//字符串的拼接
func demo2() {
let
str1 = "你若安好"
let
str2 = "便是晴天"
let
str = str1 + str2
// print(str)
//另外一种拼接方式 \()
转译字符串
let i:Int? =
10
print("\(i)便是晴天")
//NSString stringWithFormat:@"%@%@" ,"忘了他吧"
}
十二.数组的定义以及数组的拼接
//数组的拼接
func demo1() {
let
arr1 = ["范冰冰","李冰冰"]
let
arr2 = ["凤姐","刘亦菲"]
let
arr = arr1 + arr2
// print("\(arr1)\(arr2)")
print(arr)
}
十三.数组的遍历,,增加,删除,
//数组中不建议存放类型不行同的对象
var arr = ["范冰冰","李冰冰","凤姐"]
//数组的遍历
for str
in arr {
print(str)
}
//向数组中添加元素
arr.append("刘亦菲")
print(arr)
//修改元素
arr[0] =
"章子怡"
十四.字典的遍历,增加,删除,修改
//字典的定义
func demo() {
var dict = ["name":"李冰冰","age":30]
//增加键值对
dict["title"]
=
"女神"
//根据key
修改value
dict["name"]
=
"林志玲"
//删除
dict.removeValueForKey("age")
print(dict)
//字典的遍历
//(key,value)
for (a, b)
in dict {
print("key =
\(a)")
print("value =
\(b)")
}
}
//数组的删除
arr.removeFirst()//删除第一个
arr.removeLast()//删除最后一个
// arr.removeAll()//删除全部
十五.函数的定义,以及调用
//调用
//第一个参数名
可以被省略
let result =
sum(10, b:
100)
print(result)
let
result1 = area(height:
10, width:
20)
print(result1)
demo("哈哈")
demo1("嘻嘻")
demo2("呵呵")
}
//函数的基本格式
// func 函数名(参数名:
参数类型) ->
返回值类型
func sum(a:
Int, b:
Int) ->
Int {
return
a + b
}
//函数没有返回值的三种写法
//第一种写法 Void
func demo(str:
String) ->
Void {
print(str)
}
// 2.()
func demo1(str:
String) -> () {
print(str)
}
//3.
什么都没有
func demo2(str:
String) {
print(str)
}
//函数的外部参数
//1.能够让外界调用
对函数的语义更加清晰
//2.在函数内部
使用
更加简洁
func area(height a:
Int, width b:
Int) ->
Int {
return
a * b
}
什么时候会出现block 和 swift的闭包的循环引用
只有在block内部的属性对外部的block进行了一次self的保存,这时候就应该考虑循环引用了
解决方法有:
block的解决方法
1. __weak
typeof(self)
weakSelf =
self;
让一方进行weak
2. __unsafe_unretained typeof(self) weakSelf = self
闭包的解决方法:
一.
//(data) -> ()
闭包的定义 in(闭包的定义
和
执行代码的间隔 )
可执行代码
//第二种解决循环引用的方法
//unowned self
对象被回收时
不会自动指向 nil
会有风险
坏地址访问
野指针
//assgin 作用是一样的 -> unsafe_unretained
loadData {[unowned
self] (data) -> ()
in
print(data)
//使用
?
如果是nil
就不会做任何操作
print(self.view)
}
二.
func method1() {
//swfit
解决循环引用
//weak
有一个机会
会指向
nil
//[weak self]
表示闭包中访问所有的
self
都是弱引用的
//weak
作用是一样的 ->__weak
loadData
{[weak
self] (data) -> ()
in
print(data)
//使用
?
如果是nil
就不会做任何操作
print(self?.view)
}
}
func
methodOC() {
//(data) -> ()
闭包的定义 in(闭包的定义
和
执行代码的间隔 )
可执行代码
//OC的解决办法
定义weak self类型
//weak 有一个机会
会指向
nil
weak var
weakSelf = self
loadData
{ (data) -> ()
in
print(data)
//使用
?
如果是nil
就不会做任何操作
print(weakSelf?.view)
}
}
闭包:
()->()
(闭包的参数)->(闭包的类型)可执行的代码
相关文章推荐
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- 讲解iOS开发中基本的定位功能实现
- js判断客户端是iOS还是Android等移动终端的方法
- IOS开发环境windows化攻略
- 浅析iOS应用开发中线程间的通信与线程安全问题
- 检测iOS设备是否越狱的方法
- .net平台推送ios消息的实现方法
- 探讨Android与iOS,我们将何去何从?
- Android、iOS和Windows Phone中的推送技术详解
- IOS 改变键盘颜色代码
- 举例详解iOS开发过程中的沙盒机制与文件
- Android和IOS的浏览器中检测是否安装某个客户端的方法
- 分享一个iOS下实现基本绘画板功能的简单方法
- javascript实现阻止iOS APP中的链接打开Safari浏览器