腾讯微群加入QQ群

 找回密码
 加入我们

!connect_header_login!

!connect_header_login_tip!

搜索
查看: 224|回复: 0

Swift语法

[复制链接]
发表于 2016-8-23 13:21:21 | 显示全部楼层 |阅读模式
Swift的基本语法:
 
swift中的所有代码,都包含在最外侧的 {}中。

oc与swift比较:

1.oc的alloc initWithXXX 在swift中是 (xxx:)
 
2.oc中的类方法在swift中是.语法
 
 
3.oc中的枚举 在swift中用点语法隔开,也可以直接省略前缀,但不建议
例如: OC 的枚举 UIButtonTypeContactAdd
Swift UIButtonType.ContactAdd

1>可以直接省略前缀 .ContactAdd,但是Xcode 的智能提示有的时候不给力
2> 如果没有智能提示,可以直接 `回车``->``.`

4、监听方法              

swift直接使用字符串,提示:可以直接用智能提示,然后加引号和左右键,
如果有参数直接增加`:`

5. 没有分号 在程序语言中,`;` 用于拆分语句,表示一个完整的语句结束
Swift 中,大多数情况下不需要分号
例如:
leta = 10; let b = 20

6.所有的swift 程序如果崩溃在AppDelegate,都是oc的问题, oc是消息机制

7.变量和常量:
 1.    
 let a = 20
       
        
// a = 30会报错,因为let是定义常量,一旦设置就不能修改
       
       
var b = 20
       
        b = 40 //不会报错,因为var是定义变量,设置以后可以修改
2.
///自动推导 - 可以根据右侧的计算结果,推导出左侧变量/常量的类型
    /// Option + Click 热键非常重要,可以快速查看变量的准确类型
    /// 但是:Swift对类型转换要求非常严格,任何不同类型之间的数据,不允许计算
    /// Int Double 都是结构体,而 不是基本数据类型!
    func demo2() {
       
//整型默认类型是int如果64位机器,long 32位机器 int
        let x = 10
       
// Swift中,小数默认是 Double ,双精度,精度比float
        // OC中, 默认是 float,浮点数
        let y = 10.5
       
//        print(x +y)会报错: Binary operator '+' cannot be applied to operands of type 'Int' and 'Double'  ----如果要给不同类型的数据进行计算,必须手动转换类型。
            // OC 中如果要做类型转换`(int)y`
        // Swift中,使用的是`Int()` 构造函数 `init`
//       
例子:
        print(x + Int(y))
       
print(Double(x) + y)
       
       
//也可以这样转换:如果定义的变量/常量需要指定自己需要的类型,可以使用`:类型`
        let a: Double = 10; let b = 20.9  //let a = 10; let b: Int = 20.9
       
       
print(a + b)
       
    }
3.如果仅仅定义类型,并没有设置数值,会报一个没有初始化的错误: Constant 'x' used before being initialized
例子: func demo3() {
       
// 仅仅定义了类型,并没有设置数值
        let x: Int
       
       
// 常量定义完成类型后,可以有`一次`设置机会
        x = 10
       
// 设置之后,不允许再修改
        // x = 20
       
       
// Constant 'x' used before being initialized
        // 常量在使用之前,必须要做初始化
        print(x)
    }
4.  如何选择变量和常量?,只有在需要改变的时候,才应该使用‘var’
 如果从来没有变过的变量,Xcode会提示使用 let

 例子:letv = UIView()
       // 修改了 v 的属性,而没有修改 v `地址`
        v.backgroundColor= UIColor.redColor()

8.可选项: 表示一个值可以有内容,也可以为 nil
 1.定义可选项,最原始的方法, let x: Optional = 10 : Optional<Int>,表示x 要么有整数值,要么为 nil。<Int> 表示泛型
2.  2. 定义可选项,类型?的格式 :  let y: Int? :Int? 表示 x 要么有整数值,要么为 nil,`?` 是专门用来定义可选项的
常量的可选项,没有默认值,
例子:
lety: Int?
        y =10
       
       
print(y)
       

变量的可选项,默认值是nil
例子:
varz: Int?
        z = 100
        print(z) // nil
3.注意:
        //可选项不能直接参与计算!因为可能有值,也有可能为nil
        // 如果要让可选项参与计算,需要`解包unwarp`
        // unexpectedly found nil while unwrapping an Optional value
        // 翻译:在解包可选项的时候,发现了空值
        // `!` 用来解包- 如果出现 nil,会直接崩溃!
        // `!` 表示程序猿向编译器承诺,一定有值,如果没有,就崩!
       // `!` 又叫做强行解包!从可选项中把值取出来,如果没有值,抛出异常

例子: print(x! + y! + z!)


9.控制流
1、基本 if 逻辑 
注意的地方:  1. 没有 ()
            2.
必须要有 `{}`
            3.
没有单条的 if ,一定要使用 {}
                `{}`
是用来包装一段代码
            4.
很多公司的代码规范中,是不允许不使用 {}
            5. Swift中没有,非零即真,所有的逻辑条件必须指定true / false
例子
 letx = 10
 if x > 5 {
           
print("")
        }
else {
           
// 编译器自动判断分支结构,无法进入
            print("")
        }
2、三目运算
let x = 10
x > 5 ? print("") : print(") // 三目运算符 在Swift 中如果使用得当,能够简化代码

3、 `()` 表示执行,空的执行, 例子:  x >6 ? print("") : ()

4、可选项参与计算前需要解包, Swift 中,关于if 语句如果没有写好,可能会非常的丑陋!
例子:
letx: Int? = 10

ifx !=  nil{
           
print(x! +10)
        }
5、 ??   -- (x ?? 0):表示  对于可选项 x,如果有值,使用x 的值, 如果没有值,使用?? 后面的值替代。注意: ?? 的优先级低,为了不必要的麻烦,一定记住使用 ()

6、 if let/var 
if let : 作用 :判断(是否为nil) + 设置数值  ,分支内部的 num 是一定有值的,可以避免考虑`!` 的问题, num 的作用域只是在 {} 内部 , 使用频率高,if let 可以同时判断多值,使用,隔开,如果其中有一个值为nil,那就打印不出值来。大括号的作用,标示作用域,否则会穿透的。  
letx: Int? = 10
iflet num = x {
            // num += 10 let不能修改数值,想要修改数值的话,就用 if var
           print(num)
        }
if var:如果在分支内部希望修改数值,可以使用if var,

7、guard 守卫,在 Swift 2.0 推出的语法。
        // if let刚好相反
        // guard let是在判断之后的分支有效
       // 如果守护的变量 nil,直接提示并且返回
例子: var x: Int? =10
       
       
var oName:String? ="老二"
       
       
var oAge:Int? =19
       
       
       
guardlet  num = xelse {
           
           
print("x wei nil")
           
return
        }
       
guardlet  name = oNameelse {
           
           
print("name wei nil")
           
           
return
        }
       
guardlet age = oAgeelse {
           
           
print("age wei nil")
           
return
        }
        //当所有条件都满足之后,开始真正的逻辑处理
        //通常下面的代码更复杂,少一层 `{}`的嵌套!
       // 提示:无论从阅读角度,还是编译角度,都需要尽量减少嵌套层次!
        print(x)
       
print(age)
       
print(name)
       
print(num)
       结果: 
//Optional(10)
             //19
             //老二
             //1
control +i 自动调整缩进 

10、 switch 

        1.没有 break
        2.
不仅仅局限在 int,可以对任何类型的数据进行 switch
        3.
每一个 case都必须至少有一条语句,如果实在没有,可以用 break
        4.
如果要 switch多值,使用 ,分隔
        5. case
要涵盖所有的可能,如果不能列举,需要使用 default
    
穿透
  
   func demo() {
       
       
let x =“9”、9、9.9 
       
       
switch x {
       
case"10","9":print("")
        case"8":print("")
        case  “7":break
       default:print("一般")
        }
    }
11、for 循环

1.for变量 in范围 { //代码实现 },0..<5表示 0~4的范围。注意:`..<` `...`用于定义 `Range`类型,左右都不要添加空格
例子: for i in0..<5 {
           
print(i) 01234
        }
 // 0...5表示 0~5的范围
        for iin0...5 {
           
print(i)
        }
2.Range<Int>表示一个整数的范围 :起始值..<结束值  
例子:let range1 =0..<5
        print(range1) 答案:0..<5

       let range2 =0...5
        print(range2)答案: 0..<6

3.传统的 for
            没有 ()
            i是一个 var,循环过程中,增长
           提示:Swift 3.0中,i++将被取消
       
            i++ / ++i
       
            num = i++
           
等效代码
            temp = i + 1
            num = i
            i = temp
       
            num = ++i
           
等效代码
            i = i + 1
            num = i
      
     例子:   forvar i = 0; i <10; i +=1 {
           
print(i)
        }

11、字符串
Swift   String,是一个结构体,量级更轻,效率略高,推荐使用可以支持遍历
1.oc的NSString不支持遍历的 swift的String支持遍历。
       let string:String ="飞的更高"
       
       
// 遍历字符串
        for cin string.characters {
           
print(c)
        }
2.字符串拼接
        let name ="zhangsan"
       
let age =18
       
let point =self.view.center
       
       
// 格式 "\(变量/常量名)"
        //告别了 -> NSStringStringWithCGPoint
       print("\(name) ~~~ \(age)\(point)")

3.字符串的长度:将字符串转换成对应编码 UTF8字节的长度,一个中文对应的 UTF8编码占 3个字节, UTF8的字符,占用字节数为 1~4个,
 例子:
let name ="hello world你好世界"

print(name.lengthOfBytesUsingEncoding(NSUTF8StringEncoding)) 23

//获得字符串中字符的个数
       print(name.characters.count) 15
// as是类型转换 => OC (CZDemoCell *)UITableViewCell  转换成 NSString类型
        let ocName = nameasNSString
        print(ocName.length) 15

4. 格式化字符串

        let h =8
       
let m =5
       
let s =6
       
        let dateStrig = "\(h):\(m):\(s)"
        print(dateStrig) 8:5:6
       
       
// 使用数组生成格式字符串
        // String(format: <#T##String#>, arguments: <#T##[CVarArgType]#>)
       方式一: let dateString1 =String(format:"%02d:%02d:%02d", arguments: [h, m, s])
       
print(dateString1)  08:05:06
       
        // String(format: <#T##String#>, <#T##arguments: CVarArgType...##CVarArgType#>)
        方式二:let dateString2 =String(format:"%02d:%02d:%02d", h, m, s)
        print(dateString2)  08:05:06
5.子串 -方便的方法,转换成 NSString

  例子:  let str ="我们一起去飞"
       
       
// 1. 方法1,使用 NSString
        let subStr1 = (strasNSString).substringWithRange(NSMakeRange(2,4))
       
print(subStr1)
       
       
// 2. 方法2Swift的语法
        // startIndex是字符串的起始索引位置 -> 0
        // endIndex是字符串的结束的索引位置 -> count
        // advancedBy是将索引递进的函数
        //  n > 0向右递进 n个字符
        //  n < 0向左递进 n个字符
        let subStr2 = str.substringFromIndex(str.startIndex.advancedBy(2))
       
print(subStr2)
       
       
// can not increment endIndex,不允许递增 endIndex,会出现越界
        let subStr3 = str.substringToIndex(str.endIndex.advancedBy(-2))
       
print(subStr3)
       
       
// Xcode 7 beta 5开始就固定了格式了
        let startIndex = str.startIndex//.advancedBy(2)
        let endIndex = str.endIndex//.advancedBy(-2)
       
       
print(startIndex)
       
print(endIndex)
       
        // 提示如果范围越界,会崩溃 str.substringWithRange(aRange: Range<Index>)类型
       let subStr4 = str.substringWithRange(startIndex..<endIndex)
        print(subStr4)

12.集合(数组和字典)

A:数组:
 1.定义一个空的数组:  let array =[String]():[String] -> 表示存放字符串的数组,根据右侧的内容自动推导数组中的元素类型,
例子: let array = ["zhang","wang","li"]
  [Int]Swift中基本数据类型不需要包装,Int是一个结构体 let array1 = [1,2,3,4,5]
           [NSObject](继承自 NSObject 的子类) ->
       // [AnyObject],在 Swift中使用的更多,任意对象
        // Swift中允许对象没有任何父类
        //如果数组中的元素类型不一致,会推导出 [NSObject]类型
       let array2 = [1,"zhang"]
        print(array)
2.遍历数组
let array = ["zhang","wang","li"]
       
       
// 1. 直接按照下标遍历
        for iin0..<array.count {
           
print(array)
        }
       
       
// 2. for in
        // s的类型取决于数组的类型
        for sin array {
           
print(s)
        }
       
       
// 3. 遍历内容和下标
        for ein array.enumerate() {
           
print("\(e.index)\(e.element)")
        }
       
       
print("----")
       
       
// 4. 示例代码
        // n就是索引,s就是字符串
        // n s的名字可以随便写
        for (n, s)in array.enumerate() {
           
print("\(n)\(s)")
        }
       
       
print("----")
       
// 5. 倒序遍历数组
        for sin array.reverse() {
           
print(s)
        }
       
       
// 6. 倒序下标遍历
        for ein array.reverse().enumerate() {
           
print(e)
           
print("\(e.index)\(e.element)")
        }
3.增删改 ->可变 NSMutableArray -- var /不可变 NSArray -- let
 var array = ["zhang","wang","li"]
       
       
// 添加内容 addObject
        array.append("小花")
       
       
print(array)
       
       
// 以下代码有问题吗?
        // Cannot convert value of type 'Int' to expected argument type 'String'
        //不能向数组中追加不允许的类型
        // array.append(180)
       
       
// 修改
        array[0] ="老王"
       print(array)
       
        // 删除全部
  
       
       array.removeAll()
        print(array)
4.演示数组的容量
///定义类型,没有初始化,如果定义一个空的数组
//        var array: [String]
//        //
实例化一个空的字符串数组
//        array = [String]()
        //以上两句代码也可以合并成一条语句
        var array = [Int]()
       
print(array.capacity)0
       
       
// 关于容量:数组的初始容量默认是0
        //在添加元素的时候,如果超出当前容量范围,在当前容量范围基础上 * 2
        for iin0..<9 {
            array.
append(i)
            print("\(array) --容量 :\(array.capacity)”) 16
        }

5.合并数组
 var a1 = [1,2,3]
       
let a2 = [4,5,6]
       
       
// 目标,将 a2合并到 a1
        a1 += a2
       
        print(a1)

B:字典

1.字典的定义:OC中使用 {}  Swift中还是 [], 类型: [String : NSObject] / [String : AnyObject] Swift开发中,非常普遍

        - Top level object is an NSArray or NSDictionary
           
顶级节点是 NSArray或者 NSDictionary
        - All objects are NSString, NSNumber, NSArray, NSDictionary, or NSNull
           
所有对象必须是 NSString, NSNumber, NSNull
           
字典和数组中只能包含以上三种类型的值
        - All dictionary keys are NSStrings
           
所有字典的 key都必须是 NSString
        - NSNumbers are not NaN or infinity
            数值不能为空或者无穷大 (infinity)
例子: let dict = ["name":"zhang","age":18]
       
        print(dict)
2.字典的遍历
let dict = ["name":"zhang","age":18]
       
       
// 0 key
        // 1 value
        //语义不直观
        for ein dict {
           
print("\(e.0),\(e.1)")
        }
      
           前面的参数 key KEY
            后面的参数 value
       
       for (key, value)in dict {
           print("\(key)\(value)")
        }
3.增删改,可变 var,不可变 let
 //字典中的 key是通过 hash哈希值来取值的在字典中 key 是唯一的
        var dict = ["name":"zhang","age":18]
       
       
// 添加值 -如果 key不存在,新建值对
        dict["title"] ="boss"
       
       
print(dict)
       
       
// 修改值 -如果 key存在,覆盖原有值对
        dict["name"] ="老王"
       
print(dict)
       
       
// 删除
        dict.removeValueForKey("age")
       
print(dict)
       
       
// 还有一种删除方法
        dict["name"] =nil
        print(dict)
    4.拼接
        var dict1 = ["name":"zhang","age":18]
       
let dict2 = ["title":"boss","name":"老王","height":1.3]
       
       
// 目标,将 dict2的内容合并到 dict1
        // dict1 += dict2
        //遍历字典2,依次设置数值
        //遵守 key唯一的原则,如果有,覆盖 /如果没有新建
        for (k, v)in dict2 {
            dict1[k] = v
        }
       
        print(dict1)



0
0

转自:http://blog.csdn.net/yoyo_lzj/article/details/50688524?locationNum=9
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

QQ|手机版|Archiver|小黑屋|一起疯|苦咖啡 ( 新ICP备12000197号  

GMT+8, 2018-1-17 05:16 , Processed in 0.054659 second(s), 13 queries , Memcache On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表