Swift3.0 基础语法1

主要分为以下几个部分 :

  • 1.变量和常量
  • 2.可选项Optional
    • 2.1 '?' 和 ‘!’使用
    • 2.2 可选项的判断
  • 3.逻辑分支
    • 3.1 if
    • 3.2 switch
  • 4.循环
  • 5.字符串
    • 5.1 字符串遍历
    • 5.2 字符串长度
    • 5.3 拼接
    • 5.4 格式化
    • 5.5 字符串的子串
  • 6.集合
    • 6.1 数组
      • 6.1.1 数组的定义
      • 6.1.2 数组的遍历
      • 6.1.3 数组的增/删/改
      • 6.1.4 数组的容量
      • 6.1.5 数组的合并
    • 6.2 字典
      • 6.2.1 字典的定义
      • 6.2.2 字典的增删改
      • 6.2.3 字典的遍历
      • 6.2.4 字典的合并

1.变量和常量

注意点:

1.定义变量 var,定义之后,可以修改. 常量 let, 定义之后,不能修改.
所谓修改,就是修改指向

let v = UIView()
    
//仅仅修改的是V的属性,并没有修改v的指针地址
v.backgroundColor = UIColor.red
    
view.addSubview(v)

2.在Swift中对类型要求异常严格,(重要)任何不同类型的数据之间,不允许直接运算.不会做默认的隐式的转换,所有的类型确定,都要由程序员负责。

 let x = 10
 let y = 10.5
  
 1. 将y装换成整数
 print(x + Int(y))
  
 2.将 x 转换成Double
 print(Double(x) + y)

3.在Swift中,不存在基本数据类型,都是结构体。

  OC中的写法(int)y - > 类型强转
  Swift 中 Int() 结构体的构造函数

4.变量/常量的类型会根据右侧的代码执行结果,推倒对应的类型。

如果需要制定变量/常量的类型,也可以直接使用let x : 类型 = 值
提示:在Swift 开发中,极少使用直接制定类型,通常都是自动推导

let x : Double = 10
let y = 10.5

2.可选项Optional

2.1 '?' 和 ‘!’

'?' 用来定义变量是一个可选的类型,可能没有值,也可能是没值.

     常量y 使用之前必须初始化
    let y: Int? = 20
    
    输出结果Optional(10), 提示这是一个可选值
    print(x)
    print(y)    

"!" 强行解包 - 从可选值中强行获取对应的非空值,如果是nil,就会奔溃

    let x = 10
 
    let y: Int? = 20
    
    //输出结果Optional(10), 提示这是一个可选值
    print(x)
    print(y)
    
    //不同类型之间的值不能直接运算! 如果没有值是 nil 不是任何数据类型,不能参与计算
    print(x + y)

    print(x + y!)

什么时候用‘?’ , 什么时候用‘!’

1.定义可选项的时候用‘?’
  2.解包使用'!',准备计算

var 的可选值默认为nil, let 的可选值没有默认值

2.2 可选项的判断

如果有一个函数,需要打印x + y 的值如下:

 func Demo(x: Int?, y: Int?) {
    
 }

方法1:强行解包,但有风险

    print(x! + y!)

方法2:使用if判断,但是: 如果直接使用if,一不小心,会让代码很丑陋

    if x != nil && y != nil  {
        
        print(x! + y!)
    }else
    {
        print("x 或者 y 为nil")
    }

方法3:使用‘??‘,一个简单的三目运算符

   /**
     - 如果有值,使用值
     - 如果没有值, 使用?? 后面的值替代
    */
    print((x ?? 0) + (y ?? 0))

方法4: if var / let 连用语法,目的就是判断值。并不是单纯的if

if let 判断值是否为nil,{}内一定有值,可以直接使用,不需要解包
if var  连用,{}可以对值进行修改!

 let oName: String? = "老王"
     let oage: Int? = 10
    
    if let name = oName,
       let age = oage{
        
        //进入分支之后,name 和 age 一定有值,不需要解包
        //name 和 age的作用域尽在()中
        print(name + String(age))
        
    }else{
        
        print("name 或 age 为 nil")
    }

方法5: guard

 let oName: String? = "老王"
    let oage: Int? = 10
    
    guard let name = oName,
          let age = oage else {
        
        print("姓名或者年龄为nil")
        return
    }
    
    后续代码....

执行完guard代码后,name 和 age 一定有值,通常判断是否有值之后,会做具体的逻辑实现,通常代码比较多。
好处:
如果用if let 凭空多了一层分支,guard 是降低分支层次的办法

guard let & if let 的取名技巧 --->使用同名的变量

好处1.使用同名的变量接受值,在后续使用的都是非空,不需要解包。好处2.可以避免起名字的烦恼

3.逻辑分支

3.1 if判断

注意点:
1.条件不需要有()
2.语句必须有{}

   if x > 5{
        
      print("大");
      
    }else
    {
        print("小")
    }
三目运算符,语法和OC一样(常用)
   let x = 10

    x > 5 ? print("大") : print("小")
    
    //'()' 表示空执行
    x > 5 ? print("大") : ()

3.2 Switch

Switch在Swift与OC的区别
OC 中:

1.OC中 Switch() 中的值必须是整数
2.每个语句都需要一个 break
3.如果要定义局部变量,需要{}
4.OC中{}可以限定变量的作用域。

Swift中:

 1.Swift 可以针对任意类型的值进行分支,不再局限整数
 2.Swift 一般不需要break
 3.Swift 如果需要多值,使用‘,’
 4.所有的分支至少需要一条指令,如果什么都不干,才使用break

使用中:

  switch num {
    case "10","9":
        
        print("优")
        
    default:
        print("一般")
    }

4.循环

开区间循环

   变量 i 在 [0,5)循环
    for i in 0..<5 {
        
        print(i)
    }

闭区间循环

变量 i 在 [0,5]循环
for i in 0...5 {
        
        print(i)
    }

区间说明

   可计算的闭区间
   //CountableClosedRange
   let r1 = 0...5
   
   可计算的区间
   // CountableRange
   let r2 = 0..<5  

逆序循环

  for i in (0..<10).reversed() {
        
        print(i)
    }

5.字符串

Swift中String的特点:

1.String 是一个结构体,性能更高
2.String 目前具有绝大多数NSString功能
3.String 支持直接遍历
4.NSString 是一个OC对象,性能略差

5.1 字符串遍历

 let str = "hayder"
    
    for c in str.characters {
        
        print(c)
    }

5.2 字符串长度

方法1:返回指定编码的对应的字节数量

 let str = "hello world"
   
 //UTF8的编码{0-4个},每个汉字是3个字节
 print(str.lengthOfBytes(using: .utf8))

方法2:字符串长度 -> 返回字符的个数

let str = "hello world"

print(str.characters.count);

方法3:使用NSString 中转

let str = "hello world"
    
let ocStr = str as NSString

print(ocStr.length)

5.3 字符串拼接

字符串拼接需要注意: 可选项 Optional

let name = "Hayder"
let age = 18
let title: String? = "BOSS"
let point = CGPoint(x: 100, y: 100)

//\(变量/常量)
//NSStringFromCGPoint(point)
let str = "\(name) is \(age) \(title ?? "") \(point)"

print(str)

5.4 格式化

 let h = 8
 let m = 9
 let s = 6
 
 //使用格式字符串格式化
 let dateStr = String(format: "%02d:%02d:%02d", h,m,s)
 print(dateStr)

5.5 字符串的子串 -> 截取范围字符串

推荐使用:将NSString 作为中转,Swift中的取子串的一直在优化

 let str = "我们一起飞"
 let ocstr = str as NSString
 
 let s1 = ocstr.substring(with: NSMakeRange(2, 3))
 
 print(s1)

6.集合

6.1 数组

 1. OC使用[] 定义数组。Swift一样, 但是没有“@”
 2. 自动推导的结果[String] -> 表示数组中存放的都是String
 3. Swift中的基本数据类型不需要包装
6.1.1 数组的定义
 let arr = ["张三","小芳","小羊"]
    
    print(arr)
    
    //CG结构体[CGPoint]
    let p = CGPoint(x: 10, y: 300)
    let arr3 = [p]
    print(arr3)
    
    //混合数组:开发中几乎不用,因为数组是靠下标索引
    //如果数组中的类型不一致,自动推导的结果[NSObject]
    //在Swift中还有一种类型[AnyObject] -> 任意对象
    //在Swift中一个类可以没有任何‘父类’
    //***在混合的数据中,CG机构体需要包装
    let arr4 = ["张三", 1] as [Any]
    print(arr4)
6.1.2 数组的遍历
  let arr = ["张三","小芳","小羊"];

1.按照下标遍历

    for i in 0..

2.for in 遍历元素

    for s in arr {
        
        print(s)
    }

3.enum block遍历 ,同时遍历下标和内容

    元组 (offset: Int, element: String)
    for e in arr.enumerated() {
        
        print(e)
    }

4.遍历下标和内容2

     1. n 就是索引下标
     2. s 就是[String] 数组 n 对应的 String 元素
     3. 其中n/s 的名字可以随便写
      
    for (n,s) in arr.enumerated() {
       
       print("\(n) ---- \(s)")
    }

5.反序遍历

    for s in arr.reversed() {
       
       print(s);
    }

6.反序索引 & 内容(必须是enum在前, reve在后)

    for (n,s) in arr.enumerated().reversed() {
        
         print("\(n) ---- \(s)")
    }
6.1.3 数组的增/删/改

OC中数组分可变 NSMutableArray(var) / 不可变 NSArray(let)

    var arr = ["张三","小芳","小羊"];
    
    //追加元素(增)
    arr.append("老王")
    print(arr)
    
    //修改,通过下标定位(改)
    arr[0] = "小王"
    print(arr)
    
    //数组越界,不能修改
    arr[5] = "xxx"
    print(arr)
    
    //删除(删)
    arr.remove(at: 3)
    
    //删除全部,并且保留空间
    arr.removeAll(keepingCapacity: true)
6.1.4 数组的容量

设定容量可以略微的提高性能。

    //定义一个数组,指定类型是 存放Int的数组,但是没有初始化
    var array: [Int]
    
    //给数组初始化
    array = [Int]()
    
    //以上两句代码可以合并成一句
    var arr = [Int]()
    
    for i in 0..<8 {
        
        arr.append(i)
        
        //插入元素时,如果容量不够,会*2(初始0) 0 ,2,4,8,16
    }
6.1.5 数组的合并

注意:要合并数组的两个类型必须一致

   //var arr: [String]
   var arr = ["张三","小芳","小羊"] as [Any];
   
   //let arr2: [Any]
   let arr2 = ["Hayder",10] as [Any]
   
   //将array2的内容合并到array中
   //
   arr += arr2
   
   print(arr)

6.2 字典

6.2.1 字典的定义
    1.OC 定义字典使用{}
    2.Swift中使用[]
    
    [KEY: VALUE] -> [String : Any]
    let dic = ["name" : "张","age" : 10] as [String : Any]
    
    print(dic)
    
    //定义字典的数组
    let array:[[String : Any]] = [
    
        ["name" : "张","age" : 10],
        ["name" : "张","age" : 10]
    ]
6.2.2 字典的增删改
    //可变 var / 不可变 let
    var dic = ["name" : "张","age" : 10] as [String : Any]
    
    //新增 - 如果 KEY 不存在,就是新增
    dic["title"] = "大哥"
    print(dic)
    
    //修改 - 字典中是通过KEY取值,KEY在字典中必须是唯一的
    //如果KEY值存在就是修改
    dic["name"] = "大西瓜"
    print(dic)
    
    //删除 - 直接给定KEY
    // *** 科普,字典是通过 KEY 来定位值的, KEY 必须是可以 'hash 哈希' MD5一种
    //hash 就是将字符串变成唯一的‘整数’,便于查找, 提高字典遍历的素组
    dic.removeValue(forKey: "age")
    print(dic)
6.2.3 字典的遍历
    let dic = ["name" : "hayder","age": 10,"title":"老王"] as [String : Any]
    
    方式1:
    //元组 (key: Sting , value: Any)
    for e in dic {
    
        print("\(e.key),\(e.value)")
    }
    
    print("-----")
    
    /**
    前面的是 KEY
    后面的 是 VALUE
    
    具体的名字可以随便
    */
    方式2:
    for (key, value) in dic
    {
        print("\(key),\(value)")
    }
6.2.4 字典的合并
    var dic1 = ["name" : "hayder","age": 10,"title":"老王"] as [String : Any]
    let dic2 = ["name": "大瓜","height": 1.9] as [String : Any]
    
    //将dict2 合并到dict1
    //字典不能直接相加
    
    //思路,遍历 dict 2 依次设置
    //如果 key 存在,会修改
    //如果 key 不存在,不会修改
    for e in dic2
    {
        dic1[e.key] = dic2[e.key]
    }

你可能感兴趣的:(Swift3.0 基础语法1)