swift语法初识

大憨熊 提交于 2020-02-25 13:02:10

一、常量和变量

  1、swift中申明变量或者常量的时候可以不用变量或常量类型,因为系统会帮我们自动推导出对应的类型

    变量

    var a = 10

    常量

    let b = 20

    swift中我们的变量名可以实用表情或者中文表示

    var 😏 = 20

    var 一哥 = 20

    😏 + 一哥

   2、当我们的变量有小数点的时候,会自动推导出double类型

    var yige:Int = 20

    var yijie:Float = 1.8

    var erge:String = "涨价"

    var erjie:Character = ""

    swift不支持隐式转换,OC中强制转换

    yige + Int(yijie)

    3、常用操作

    字符串拼接:+

    判断两个字符串是否相等:==

    4、数据类型的写法

    空数组的写法

    var array3 = Array<String>()

    var array4 = [String]()

    添加元素

    array2 += ["何必"]

    array2.append("123")

      array2.appendContentsOf(["333"])

    array2.insert("jiehun", atIndex: 2)

    array2.insertContentsOf(["222", "234"], at: 3)

    删除元素

    array2.removeLast()

    array2.removeAtIndex(2)

    array2.removeFirst()

    array2.removeAll()

    字典的写法

    var dict1:Dictionary<String, Int> = ["a" : 10]

    var dict2 = ["b" : 20]

    var dict3:Dictionary<String, Int> = [:]

    var dict4 = Dictionary<String, Int>()

    dict3 = ["b" : 30]

    删除字典元素

    dict3.removeValueForKey("b")

    dict1.removeAll() 

    元组

    var aa = ("b", ["a", "b"], ["a" : 20])

    访问元组中的数据

    aa.0

    aa.1[1]

    aa.2

    5、?、!、??

    ?表示该值是可选类型。即可能有值,也可能为nil,可选类型不能直接使用,必须进行“!强制解包

    var a:String?

    !表示强制解包,只有用到?号才会使用!解包。因为带?号的值中包含有Optional,只有解包后才能拿到完整的值。但是对nil进行解包会造成程序Carsh

    print(a!)

    ??的作用是 当变量或常量没有值时,使用??后面的值,有值则使用原来的值

    print((a ??  "123").characters.count)

    6、数据结构

    while循环

    var f1 = 10

    while f1 < 40 {

        f1 += 1

        print(f1)

    }

    //do while循环

    repeat {

        f1 += 1

    } while f1 < 20

 

    // 判断

    if 没有非零即真的概念,只有truefalse的两种情况

   

    if let tempStr = str {

        print(tempStr)

    }

 

    if-let-where if-let相似,where是对前面定义的这个局部变量在做一层判断

    if let tempStr = str where tempStr.characters.count > 2 {

       print(tempStr.characters.count)

    }

 

    guard-let-else

    如果str为空,则执行代码块。代码块中最后一定要return出来。不为空,则强制解包后赋值给tempStr,代码块不执行。和iflet效果相反

    guard let tempStr = str else {

        return

    }

 

    // switch

    // 每个分支后不用写break,不会造成贯穿效果。但是结尾必须写default,并且每个case后,必须有代码进行处理

    switch a {

    case 0:

        print("123123")

    case 10:

        print("432143321")

    default:

        print("32451")

    }

 

    // 枚举

    // 在枚举中,直接取值只能取到等号左边的值,只有加上rawValue才能取到等号右边的值

    

    关联如果是Int,会默认的递增上去,如果不是Int,必须每个枚举值都关联上对应的值。String一样

    enum couples: String

    {

        case yige = "王康威"

        case yijie = "袁敏"

        case erge = "张加法"

        case erjie = "周抚平"

    }

 

    var hehe = couples.yige.rawValue

 

 

    enum hahaha: Int {

        case a = 1

        case b = 2

        case c = 3

    }

     rawValue能获得枚举中等号右边的值

    var heihei = hahaha.a.rawValue

    hashValue能获得改枚举值在枚举中的位置。位置是从0开始计算的

    var heihei = hahaha.a.hashValue

    7、函数

        // 有参有反

        func jiafa(a:Int, b:Int) -> Int {

            return a + b

        }

        // 有参无反

        func action(a: Int) -> Void {

            print(a)

        }

        // 无参有反

        func action1() -> Int {

            return 5

        }

        // 无参无反

        func action2() -> Void {

            print("无参无反")

        }

    8、闭包(就是OC中的block)

    写法和调用

          let closure = {

              ()->() // void也表示无反

          in

              print("无参无反")

          }

          closure()

    

          let closure1 = {

              (string:String) -> Void

              in

              print(string)

          }

          closure1("有参无反")

        

          let closure2 = {

              () -> String in

              return "无参有反"

          }

          print(closure2())

        

          let closure3 = {

              (str:String) -> String in

              return str + "6666"

          }

          print(closure3("有参有反"))

    

    函数与闭包结合使用

    函数声明部分

    func createView(coloc:UIColor, frame:CGRect, closure:(c:UIColor, f:CGRect) -> UIView) -> UIView {

          return closure(c: coloc, f: frame)

      }

     函数调用部分

    

    // swift里面不写self,一般只有闭包内部才会强制要求写self

        view.addSubview(createView(UIColor.redColor(), frame: CGRectMake(100, 100, 100, 100)) { (c, f) -> UIView in

            let v:UIView = UIView(frame: f)

            v.backgroundColor = c

            return v

            })

     9、单例

    

    var name:String?

      单例写法1

        static var shareSingleDog:SingleDog = {

            let instance = SingleDog()

            return instance

        }()

    

       单例写法2

        static let instance = SingleDog()

        static func shareSingDog() -> SingleDog {

            return instance

        }

     10、KVO

    

    var name:String?

      var gender:String?

  字典转模型中,模型中如果有基本数据类型的话,基本数据类型不可以为可选类型,否则在KVC赋值中会找不到对应的key值。如果为可选类型的话,应该给初始值

        var age:Int = 0

    init(dict : [String:AnyObject]) {

        super.init()

        setValuesForKeysWithDictionary(dict)

    }

    如果自定义了初始化方法并且没有实现系统默认的初始化方法,那么外界访问不到该类的默认初始化方法,想要访问的话必须手动实现

    override init() {

        super.init()

    }

  调用部分

        let dict = ["name" : "zhangsan", "age" : 12, "gender" : "male"]

        let person:Person = Person(dict: dict)

   11、 json数据解析、异常捕获

  

    let path = NSBundle.mainBundle().pathForResource("iOS04", ofType: "json")

         let data:NSData = NSData(contentsOfFile: path!)!

     let arr = try NSJSONSerialization.JSONObjectWithData(data, options: .MutableContainers) as! [[String : String]]

 

    异常捕获使用do{} catch {}

    try 表示弱try,即解析出错,程序不奔溃

    try? 表示强try,即解析出错,程序立刻奔溃

    一般使用try即可

    do {

              let arr = try NSJSONSerialization.JSONObjectWithData(data, options: .MutableContainers) as! [[String : String]]

              print(arr)

          } catch {

              // 异常捕获,序列化出错的时候自动来到这里

              print("error")

          }

 

 

 

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!