常量和变量
开发中 推荐使用 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
}
可选项
/*
?:可选项 有吗 有值 就是具体类型的值 没有值 是nil
打印可选项 会带上optaional
!:有!!!
*/
func demo1(){
var a: Int? =10
print(a)
}
分支结构
/*
条件:没有()
2.{}不能被省略
在swift 中没有 非零既真的概念
只有true 和 false
*/
func demo2(){
let i = 10
if i > 0 {
print("大于0")
}
}
//if的实际运用
//1.if let 表示 赋值 并且判断是否为空
func demo3(){
//1.urldtring
let urlstring = "http:www.baidu.com"
//2.url
if let url = NSURL(string: urlstring){
//程序能够走到这个分支 就表示 url 一定有值
let request = NSURLRequest(URL:url)
}
}
循环
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
demo4()
}
// _ 表示 忽略
func demo4() {
for _ in 0..<10 {
print("hello world")
}
}
//2.循环
// 0...10 0~10 包含结尾
func demo3() {
for i in 0...10 {
print(i)
}
}
//swift循环
// 0..<10 0~ 9
func demo2() {
for i in 0..<10 {
print(i)
}
}
//仿OC循环 循环的条件 可以省略 ()
//递增的变量 不能使用 let
func demo1() {
for var i = 0; i<10; i++ {
print(i)
}
}
}
字符串
import UIKit
/*
OC : NSString 继承 NSObject 效率略低 不支持遍历
swift: String 是结构体 更加高效 支持遍历
*/
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
demo4()
}
//字符串和range 截取子串
func demo4() {
//将 String 转换成 NSString 再去截取子串
let str = "听说下雨天,美女,炸鸡,啤酒更加配哦"
//as 转换类型
let subStr = (str as NSString).substringWithRange(NSMakeRange(6, 2))
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 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)
}
}
数组
import UIKit
/*
swift数组 [元素]
let: 不可变数组
var: 可变数组
*/
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
demo1()
}
//数组的拼接
func demo1() {
let arr1 = ["范冰冰","李冰冰"]
let arr2 = ["凤姐","刘亦菲"]
let arr = arr1 + arr2
print(arr)
}
func demo() {
//数组中不建议存放类型不行同的对象
var arr = ["范冰冰","李冰冰","凤姐"]
//数组的遍历
for str in arr {
print(str)
}
//向数组中添加元素
arr.append("刘亦菲")
print(arr)
//修改元素
arr[0] = "章子怡"
//数组的删除
arr.removeFirst()
arr.removeLast()
// arr.removeAll()
print(arr)
}
字典
import UIKit
//OC {}
//swift [key : value] 键值对
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
demo()
}
//字典的定义
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)")
}
}
}
函数
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
//调用
//第一个参数名 可以被省略
let result = sum(10, b: 100)
print(result)
let result1 = area(height: 10, width: 20)
print(result1)
demo("哈哈")
demo1("嘻嘻")
demo2("呵呵")
}
//函数没有返回值的三种写法
//第一种写法 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
}
//函数的基本格式
// func 函数名(参数名: 参数类型) -> 返回值类型
func sum(a: Int, b: Int) -> Int {
return a + b
}
}
闭包
/*
1.提前准备好的一段可以执行的代码
2.可以当做参数传递
3.在需要的时候 执行闭包
4.在闭包中 访问 self 可能会出现循环引用
*/
import UIKit
class ViewController: UIViewController {
//在swift中定义属性
// var finishedCallBack: () -> ()?
//属性 默认就是强引用
var finishedCallBack: ((data: String) -> ())?
override func viewDidLoad() {
super.viewDidLoad()
//(data) -> () 闭包的定义 in(闭包的定义 和 执行代码的间隔 ) 可执行代码
//第二种解决循环引用的方法
//unowned self 对象被回收时 不会自动指向 nil 会有风险 坏地址访问 野指针
//assgin 作用是一样的 -> unsafe_unretained
loadData {[unowned self] (data) -> () in
print(data)
//使用 ? 如果是nil 就不会做任何操作
print(self.view)
}
//调用
loadData10 {
}
}
func loadData10(finished: () -> ()){
}
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)
}
}
//() -> () 没有参数没有返回值的闭包
// (闭包的参数) -> 闭包的返回值
func loadData(finished: (data: String) -> () ) {
//开始异步加载数据
//记录参数闭包
finishedCallBack = finished
dispatch_async(dispatch_get_global_queue(0, 0)) { () -> Void in
//
print("开始网络耗时操作")
dispatch_async(dispatch_get_main_queue(), { () -> Void in
//执行回调
//闭包是外部传递过来的 self 明确调用的上下文
self.working()
print("哈哈哈哈")
})
}
// 闭包的简写
//当函数的最后一个参数 是闭包 可以将闭包简化为 '尾' 随闭包
dispatch_async(dispatch_get_global_queue(0, 0) ,{ () -> Void in
})
}
func working() {
finishedCallBack?(data: "加载数据成功")
}
//析构函数
deinit {
print("VC 88")
}
}