您的位置:首页 > 移动开发 > Swift

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)

        }

    }

    

闭包:

()->()

(闭包的参数)->(闭包的类型)可执行的代码
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  iOS