swift语言入门介绍


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中会发送消息,但没有任何作用。











  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值