Swift开发入门-基础知识(一),附demo

文章中的内容已全部更新至Swift5!

Swift是一门新的语言,不过现在已经出到Swift5了,今天不介绍这些。很多人想学Swift,不知从何开始,今天我就简单说下入门知识,我认为在学习Swift之间最好先把这些基本的知识掌握了,才能更好的去认识它学习它,使用它。

全是干货,并且附上demo:swift基础知识demo

阅读顺序:
Swift开发入门-基础知识(一)
Swift开发入门-进阶知识(一)
Swift开发入门-进阶知识(二)
下面👇的基本介绍,我建议大家认真读一读,尤其是从OC转过来的程序员一定要看一下,Swift是一门全新的语言,和OC的差别很大。

注:代码里面的注释很清楚,很详细,所以语言描述大多会省略

开始 --- Swift --- Coding

基本介绍

这里只介绍一些初学swift的基本概念,需要提前了解的东西

  1. Swift语法和OC不一样,OC每一行代码都是以分号 ";" 结尾的,但是Swift结尾是没有结尾标识符的
  2. 之前Swift非常注重格式,比如 a = 3 ,在=的左右必须都有一个空格。现在前后空格个数不一样,不会报错了,但是还是建议写的规范一些。
  3. OC调用方式的时候是,是类名或对象名+空格+方法名,然后用中括号括起来:[Person saveCall]; Swift是类名或对象名+.,+方法名即可: person.saveCall ,类似与OC的点语法
  4. Swift语法整体兼容OC,可以通过桥接和OC无缝对接
  5. Swift语法风格整体类似于Java
  6. 新建的Swift类,只有一个.swift文件,没有.h文件和.m文件
  7. Swift可以使用cocoapods,方法同OC一样
  8. 不需要导入头文件,可以直接引用其他类里面的方法或属性
  9. Swift没有宏这个概念
    10.Swift没有类扩展一般写在最下面
  10. 没有main.m文件,@UIApplicationMain是程序入口标识
  11. class 标示声明类 {}用来标识类的范围
  12. 构造函数 [xxx alloc] initWithXXX] ==> xxx(XXX:)[alloc init] => ()
  13. UIButtonTypeContactAdd => 枚举类型.枚举值(简写 .枚举值)
  14. 在当前类中访问属性或者方法的时候 可以省略 self.,推荐不写,后面的闭包中必须添加self.
  15. 按钮的监听事件:使用 #selector
  16. 整体语言风格类似java
  17. Swift语言要求严格,属于静态语言。编译之前,就会对语法类型等,进行检测

1. 常见和变量

// MARK: - 常量和变量
    func testDemo1() {
        
        let a = 10
        // a = 2   ----> 会报错 let定义的变量不能改变,不能进行赋值
        print(a)   // ---> 打印使用print语法,不适用nslog
        
        
        var b = 20
        b = 30   //不会报错,var定义的变量是可以被修改的
        print(b)
        
        let c: Int = 10
        let d: CGFloat = 20.3
        /*
         swift是一个强类型的语言
         option + click 是swift开发的热键 没有之一
         Int 是swift中整数的默认类型(NSIbteger)
         小数默认类型是double
         let d: CGFloat = 20.3  这属于手动指定类型
         */
       
        // let res1 = c + d   -->  会报错
        let res2 = c + Int(d)
        print(res2)
        /*
         不同类型之间的运算
         swift中类型不一样的时候不能操作,没有银行形式的转换 需要coder手动转换数据
         转换类型: 通过类型调用构造函数 传递参数转换 ,或as语法
         */
        
        // let f: Int
        // print(f) //报错,未初始化之前都不能使用
    }

2. Swift与OC的不同演示

  func scondDemo() {
        let myView = UIView(frame: CGRect(x: 100, y: 100, width: 100, height: 100))
        //        myView.backgroundColor = UIColor.yellow
        myView.backgroundColor = #colorLiteral(red: 1, green: 0.3233583075, blue: 0.3979080506, alpha: 1)
        //color Literal属性
        
        let btn = UIButton(type: UIButtonType.custom)
        //let btn1 = UIButton(type: .contactAdd)  可以简写 直接.+枚举
        myView.addSubview(btn)
        
        //添加到根视图  --> 这里可以省略self,也可以写self.view  
        view.addSubview(myView)
        
        //给按钮添加点击事件
        btn.addTarget(self, action: #selector(btnDidClick), for: .touchUpInside)
        
    }
    @objc func btnDidClick() {
        print("我被点击了")
    }
    

3. 元组

   // MARK: - 元组
    func testDemo3() {
        //元组可以吧多个值组合成一个复合值.元组内的数据可以是任意类型的,重点:不要求元素的类型相同
        //不想接收值,直接用下划线_代替
        //可以使用标签,类似于字典
        
        let xiaoming = (25,"小明","清华大学")
        print(xiaoming.0,xiaoming.1)
        
        let (age, name, _) = xiaoming
        print(age,name)
        
        let xiaozhou = (age: 29, name: "神合")
        print(xiaozhou.age,xiaozhou.name)

    }

4. 可选类型

可选类型将是我们在学习swift中的一个大雷,短时间内我们很难接受,这是一个全新的概念,是OC中没有的

  • 可选类型有可能有值,也有可能为nil
  • let声明可选类型是没有意义的
  • 必选类型一定有值
  var a:Int? = 10
   a = nil
  //这就是一个可选类型
  //不能够对可选类型做强制解包
  var b: Int? = 15
  let c = (b ?? 0) + 20
  var d = 10
  let res = 20 + d
        
  print(res,(b ?? 0),c,d)
  //可选类型不能够直接计算

你是否需要使用'?'或者'!'进行解包
-- '!' 强制解包 一定要获取一个值 不能够为nil
-- '?' 可选解包 后面具体说
-- 如果可选类型要进行计算的时候,系统会报错,需要程序员手动处理可选类型
-- '!' 强制解包有风险,需要谨慎使用,程序员需要对'!'负责 如果为nil 程序会崩溃
-- 一定要考虑是否安全 一定有值 防患于未然
-- '??' 合并空选项 必须提高 ?? 的优先级

5. 分支结构

分支结构也就是if语句和switch语句

分支结构 if语句
  1. 条件语句没有() ,可以写,但不推荐写
  2. 分支结构必须有 {}
  3. 没有非零即真的概念,只有truefalse
    let a = 13
    if a < 14 { 
        print("小,很小,非常小")
    } else {
        print("大,很大,非常大")
    }
5.1 if let

模拟网络请求

 let urlString = "http://www.zxhkit.com"
 let url = URL(string: urlString)
 if url != nil {
     let req1 = URLRequest(url: url!)
 }
        
 if let url2 = URL(string: urlString) {
     let req2 = URLRequest(url: url2)
     //只有当url2不为空的时候,才会执行里面的代码
 }
5.2 guard(守卫) let else

作用与if let 相反 , guard let 能够减少一层分支嵌套

   let urlStr = "http://www.zxhkit.com"
   guard var url1 = URL(string: urlStr) else {
       //不希望guard 能够被穿透
       //如果url1 为nil 就进入else 分支 会直接return
       return
   }
   let req = URLRequest(url: url1)
5.3 guard 多个可选值的判断
   var age1: Int? = 15
   var age2: Int? = 20
        
  if age1 != nil && age2 == nil {
      print(age1!,age2!)
  }
        
  guard let _ = age1,let _ = age2 else {
      print("嘎嘎嘎")          
      return;
  }
5.4 switch

switch在swift中和OC中略有不同

  1. 不需要写break
  2. 每个匹配项中至少有一段代码可以执行
  3. 可以判断任意类型
  4. 一次可以匹配多个值
  5. 在匹配项中可以声明临时变量,而且不需要加 {} 限制作用域
    let x = "20000"
     switch x {
     case "20000","30000":
         print("架构师")
     case "18000":
         print("高级开发工程师")
     case "12000":
         print("中级开发工程师")
     case "6000":
         print("菜逼")
     default:
         print("逗比")
     }

6. 循环

循环,基本没有变

6.1 首先是where语句和repeat-where语句(类似OC的do-where
// while语句
        var num = 5
        while num > 0 {
            print(num)
            num -= 1
        }
        //打印结果:
        /*
        5
        4
        3
        2
        1
        */
        
        //repeat-while相当于OC中的do-while
        var ber = -4
        repeat {
            ber += 1
            print(ber)
        } while(ber > 0);

6.2 for循环
    func testDemo6() {
        // 循环的范围可以直接定义出来使用
        let range = 0...10
        for i in range {
            print(i)
        }
        print("----------------------")
        
        //遍历0到10,不加包括10,   0..<10 表示不包括10
        for i in 0..<10 {
            print(i)
        }
        
        
        //对没有使用的变量或者常量在编译的时候可以忽略
        for _ in 0..<10 {
            print("😑")
        }
        
        print("----------------------")

        let names = ["anni","roky","lily","bob","jeem"]
        for name in names {
            print(name)
            //这里可以打印出来每一个元素值
        }
        
        for name in names[0...2] {
            //只会打印前三个
            print(name)
        }
        
        for name in names[..<2] {
            //半开区间,只会打印前三个
            print(name)
        }
  }
      
6.3 continue和break的使用
//break将直接跳出当前循环
        //continue继续当前循环,但是continue后面的代码不再执行
        for i in 1...10 {
            if i == 2 {
                continue
            }
            if i > 7 {
                break
            }
            print(i)
        }

7. range

   // MARK: - range
    func testDemo7() {

        // 补偿一点:range
        let range = 0...9
        let isHave = range.contains(4)
        print(isHave)//结果是怎么样的呢
        
        let range1: ClosedRange<Int> = 1...5
        let range2: Range<Int> = 1..<6
        let range3: PartialRangeThrough<Int> = ...5

        print(range1,range2,range3)
        
        
        let strRange1 = "a"..."f"
        let isRh = strRange1.contains("b")//结果:true
        
        let strRange2 = "cc"..."ff"
        let isRh1 = strRange2.contains("cb")//结果:false
        let isRh2 = strRange2.contains("dz")//结果:true
        let isRh3 = strRange2.contains("fg")//结果:false

        print(isRh,isRh1,isRh2,isRh3)
        
        //从打印结果看,表示两个字母都必须在这个范围内
        
        let time = 13
        let margin = 2
        for item in stride(from: 4, through: time, by: margin) {
            print(item)
            //表示从4开始,一次累加2,直到13(不超过13)
        }        
    }

8. 字符串

这个我们在开发中会经常用,而且字符串有很多方法属性,我们只介绍常用的

    //字符串的本质是结构体
    let str: String = "长得帅可以撩妹,长丑是骚扰"
    //String和NSString可以相互转换
    let NSstr = str as NSString
    print(NSstr)
        
    //字符串的基本属性
    let str1 = "长得帅可以撩妹,长丑是骚扰"
    //长度
    let len = str1.lengthOfBytes(using: .utf8)
    print(len)
    //字符集合
    let length = str1.count
    print(length)

遍历字符串

for character in str1 {
     print(character)
}

字符串的拼接

 //使用 + 来拼接字符串
 let str2 = "别低头,绿帽会掉"
 let str3 = "别哭泣,老王会笑"
 let res1 = str2 + str3
 print(res1)
 let name = "王哥"
 let age = 13

字符串的转义:

 // : \() 转义符号 转义字符串
 let res2 = name + String(age)
 let res3 = name + "\(age)"
 let res4 = "\(name)\(age)"
 print(res2,res3,res4)

字符串的格式化:

 let z = 9
 let x = 1
 let h = 20
 // 09:01:20
 //可以接受可变参数
 let res5 = String(format: "%02d:%02d:%02d", z,x,h)
 print(res5)

字符串的截取:

//字符串的截取
 let str4 = "我喜欢手指在键盘上飞舞的感觉"
 let start = str4.index(str4.startIndex, offsetBy: 3)
 let sub1 = str4.suffix(3)
 let sub2 = str4.suffix(from: start)
        
 print(sub1,sub2)

9. 集合: 数组,字典

9.1 数组的声明 和 空数组的实例化
  • 不推荐在数组中放不同的元素
  • 实例化空数组
  • 常量类型的空数组没有意义
 let array: [Any] = ["阿大,阿二,阿三",18]
 print(array)
 var emptyArray = [String]()
9.2 数组的增删改查,遍历数组,同时遍历角标和对应的值:
//2.增删改查
 //var表示可变数组
 var arr = ["大哥","二哥","三哥","四哥"]
 //增
 arr.append("老司机")
 //改
 arr[0] = "姐姐"
 //删
 arr.remove(at: 1)
 //查
 for str in arr {
    print(str)
 }
        
 //倒序遍历
 for str in arr.reversed() {
    print(str)
 }
        
 //同时遍历角标和对应的值
 for (index,value) in arr.enumerated().reversed() {
     print(index)
     print(value)
 }
9.3 数组的合并 :
//数组的合并
let array1: [Any] = ["老张","老李",19]
let array2: [Any] = ["大哥","大姐",23]
let array3 = array1 + array2
print(array3)
9.4 字典: 声明、增删改查
  • 同样是使用[] 来声明;
  • [String : Any] 是最常见的字典格式
 let dict: [String : Any] = ["name" : "玄哥","age" : "21"]
 //声明空字典
 var emptyDict = [String : Any]()
 var dic: [String : Any] = ["name" : "玄哥","age" : "21"]

 //增
 dic["love"] = "镜子"
 //改
 dic["love"] = "小镜子"
 //删
 // dic.removeAll()
 dic.removeValue(forKey: "age")
 //遍历
 for (key,value) in dic {
     print(key,value)
 }
        

10. where(条件)

这里where 不是循环,是判断条件!

   // MARK: - where
    func testDemo10() {
        
        //where搭配switch语法的使用
        let point = (1, 1)
        switch point {
        case let (x, y) where x == y :
            print("特殊点",x,y)
            break
        default:
            break
        }
        
        //where搭配for循环语法的使用
        
        let items = [12,14,23,42,23,100]
        
        for item in items where item > 99 {
            print(item)
            //结果:100
        }
        //从上面列子可以看出where就是一个条件选择
        
    }

11. 函数(方法)

方法有很多种,我们举几个例子你就懂了
//函数的内部函数:在函数的内部再声明一个函数,并调用

    func numOne() {  
        func numTwo(a: Int,b: Int) {
            print(a * b)
        }
        //内部调用
        numTwo(a: 2, b: 4)
    }

普通的函数:

func numTwo {
    print(普通的函数)
}

有参数的函数:

 func getArea(a: Int,b: Int){
      let res = a * b
      print(res)
 }

有参数有返回值的函数:

//求面积:
 func getArea(a: Int,b: Int) -> Int {
      return a * b
 }

有参数有返回值的函数的升级版:

  • width 表示外部参数 a 和 b 标识函数的内部参数只能够在内部使用
  • 能够让函数的可读性更强,同时也能够让函数在内部使用参数更加简单
    func getArea2(width a:Int,height b: Int) -> Int {
        return a * b
    }

总结:

这只是入门知识,把这些看懂后就可以写一些简单的demo了。
学习swift还有一个很好的教材,那就文档,很多不喜欢看文档最主要的原因是因为:看不懂英文。还好swift有中文版的文档:swift5中文文档
配合学习,加油 加油!!!

最后,附上这篇文上所有代码的demo:swift基础知识

纯手敲,更新不易,如果对你有帮助,请点赞+评论!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容