swift3.0 后基础语法 / 变化 一

本贴最后更新于 3069 天前,其中的信息可能已经时过境迁

之前学习了 swift,但是感觉语法变化太大,经常很多写法,现在 swift 已经相当稳定,但是看了下发现之前写的代码一片红,才发现很多地方变了,所以准备最近再看下,主要是要用起来

方便起见直接贴代码

// 1.导入框架 import UIKit //        2.在swift中如果定义一个标识符.必须告诉编译器该标识符是一个变量还是一个常量 //         如果是常量使用let修饰 //         如果是变量使用var修饰 //         let 标识符的名称 : 类型 = 赋值 //可以省略类型,有类型推导 //         var 标识符的名称 : 类型 = 赋值 //        使用注意: //        1.一般优先使用let,只有当是需要修改时候才使用var //        2.常量的本质:指向的内存地址不可以被修改,但是可以通过内存地址获得对象后,之后修改对象的内部的属性 //        3.隐式转化:在Int类型和Double进行基本运算时,会自动将Int类型转成Double //        let a : Int = 10;//如果一行只有一条语句那么后面的;可以省略 //        a = 10;//报错,因为let是常量不可以被修改 //        let view : UIView;// = [UIView alloc] init]; //        var b :Double = 1.44; //        b = 20.44;//b是变量可以被修改 //        let a = 10.0; //        let result = Int(a); //        print(result) // //        let view : UIView = UIView(); //        view.backgroundColor = UIColor.red; //        view.frame = CGRect(x: 10, y: 10, width: 100, height: 100); //        self.view.addSubview(view); // //        let view1 : UIView = UIView(frame: CGRect(x: 20, y: 20, width: 100, height: 100)); //        view1.backgroundColor = UIColor.blue; //        self.view.addSubview(view1); // //        let btn : UIButton = UIButton(frame: CGRect(x: 0, y: 0, width: 20, height: 20)); //        btn.backgroundColor = UIColor.green; //btn方法调用 //        btn.addTarget(self, action: #selector(ViewController.youyouyou), for: UIControlEvents.touchUpInside) //        btn.addTarget(self, action: #selector(ViewController.youyouyou), for: .touchUpInside)//或者这样 //        view1.addSubview(btn); //        3.打印 //        print("hahah") //         4.swift和OC的区别 //         1.swift中if后面的()可以省略 //         2.没有非0即真,必须有明确的Bool -> true/false //        let a = 10; //        if a > 0 { //            print("a大于0") //        } else { //            print("a不大于0") //        } // //        let score = 66; //        if score < 0 || score > 100 { //            print("不合理的分数") //        } else if score < 60 { //            print("不及格") //        } else if score < 80 { //            print("及格") //        } else if score < 90 { //            print("良好") //        } else { //            print("优秀") //        } //         5.三目运算符 //        let m = 10; //        let n = 20; //        let result = m > n ? m : n; //        print(result);//n 20 //         6.guard的使用 //         1.如果条件表达式为真,则会执行后面的语句 //         2.如果条件表达式为假,则会执行else后面的{}中的语句 //func getScore( a : Double) -> Void { //     //    guard a > 60 else { //        print("不及格") //        return //    } //    guard a > 80 else { //        print("不错,及格了") //        return //    } //    guard a > 100 else { //        print("优秀") //        return //    } //    print("chao神") //} //         7.swift中的switch和OC的区别 //         1.switch后面的()可以省略 //         2.case结束后可以不加break,系统会默认跟上break //         3.case后面跟多个条件,并且多个条件以,进行分割 //         4.如果case中希望产生case穿透,可以使用fallthrough //         5.switch支持浮点型 //         6.switch支持字符串类型 //         7.switch支持区间类型 //func getSex(sex:Int) -> Void { //    switch sex {//sex可以是整型,浮点型,字符串 //    case 0: //        print("女") //    case 1,2,3: //        print("男") //    case 4...8: //        print("幺") //    fallthrough//穿透 //    default: //        print("不知道") //    } //} //swift中方法 //func youyouyou() ->  Void{ //    print("hahah") //} //        8.循环for //      需求:打印0-9 //      1.写法一 //for i in 0..<10{ //    print(i) //} //      2.写法二 //        如果for循环中不需要使用到下标i,可以用_代替 //for _ in 0..<10 { //    print("aoliu") //} //        9.循环while  do while //        注意: //            1.没有非零即真,必须有一个明确的bool值 //            2.while后面的()可以省略 //            3.没有a-- //            4.do while 不是do ,do用到了异常捕获 这里用repeat代替 //var a = 10 // //while a > 0 { //    a -= 1 //    print(a) //} //var m = 10 //repeat { //    m -= 1 //    print(m) //}while m > 0 //        10.字符串 //            注意: //             一,OC和Swift中字符串的区别 //                1.在OC中字符串类型时NSString,在Swift中字符串类型是String //                2.OC中字符串@"",Swift中字符串"" //             二.使用 String 的原因 //                String 是一个结构体,性能更高 //                NSString 是一个 OC 对象,性能略差 //                String 支持直接遍历 //                Swift 提供了 String 和 NSString 之间的无缝转换 //let str = "hello world" //var string = "hello world" //string = "aoliu" //1.获取字符串长度 //let length = string.characters.count //2.遍历字符串中所有的字符 //for c in string.characters { //    print(c) //} //3.字符串的拼接 //let a = "ao" //let b = "liu" //let result = a + b //4.字符串和其他标识符的拼接 //let age = 18 //let name = "aoliu" //let height = 1.78 //let info = "my name is \(name) ,\(age) years old, height is \(height)" //5.字符串的格式化 //let time = 90 //let min = time / 60 //let second = time % 60 //let timeStr = String(format: "%02d:%02d", min,second) //6.字符串截取:将String转变为NSString再截取 //let urlString = "www.baidu.com" //let header = (urlString as NSString).substring(to: 3) //let footer = (urlString as NSString).substring(from: 10) //let range = NSMakeRange(4, 5) //let middle = (urlString as NSString).substring(with: range) //        11.数组 //            数组(Array)是一串有序的由相同类型元素构成的集合 //            数组中的集合元素是有序的,可以重复出现 //            Swift中的数组 //            swift数组类型是Array,是一个泛型集合 //1.定义数组 //let array : [String] = ["aoliu","xiaowang"]//不可变 [String]泛型 //var array1 = [String]()//可变数组 //2.CRUD //array1.append("xiaomin") //array1.append("xiaohong") //array1.append("xiaoli") //array1.remove(at: 1)//返回值是删除的元素 //array1.remove(at: 0)//返回值是删除的元素 // //array1[0] = "ao" // //let name = array1[0] //3.遍历数组 //for i in 0..<array1.count { //    print(i) //    print(array1[i]) //} // //for name in array1 {//常见 //    print(name) //} // //for (index,name) in array1.enumerated(){//swift提供的既能拿到下标又能拿到元素,常见 //    print(index) //    print(name) //} //for name in array1[0..<1]{//可以指定遍历区间 //    print(name) //} //4.数组合并 //注意:只有相同类型的数组才能合并,不一致不能 //let name1 = ["aoliu","xiaowang"] //let name2 = ["xiaohong","xiaoli"] //let name3 = name1 + name2 //        12.字典 //        字典允许按照某个键来访问元素 //        字典是由两部分集合构成的,一个是键(key)集合,一个是值(value)集合 //        键集合是不能有重复元素的,而值集合是可以重复的,键和值是成对出现的 //        Swift中的字典 //        Swift字典类型是Dictionary,也是一个泛型集合 //        []如果里面放元素就是数组,如果放键值对就是字典 //1.定义字典 //let dict :[String:Any] = ["name":"AOLIU","age":26] //var dictM = [String : Any]() //2.对可变字典的基本操作 //dictM["name"] = "XIAOWANG" //dictM["name"] = nil //dictM.updateValue(19, forKey: "age") //print(dictM) //dictM.removeValue(forKey: "age") //print(dictM) //let name = dictM["name"] //print(name ?? "dd") //如果name没有值为nil就用??后面的代替 //3.遍历字典 //3.1遍历字典中所有的key //dictM["name"] = "XIAOWANG" //dictM["age"] = 26 //for key in dictM { //    print(key)//打印出的是一个元祖,随后看 ("name", "XIAOWANG") ("age", 26) //    print(key.0)// name age //    print(key.1)// XIAOWANG 26 //} //for key in dictM.keys { //    print(key)//name age //} //3.2遍历字典中所有的value //for value in dictM.values { //    print(value)//XIAOWANG 26 //} //3.1遍历字典中所有的key/value //for (key,value) in dictM {//()元祖 //    print(key)//name age //    print(value)//XIAOWANG 26 //} //4.合并字典  // 字典不可以相加合并 //let dict1 :[String:Any] = ["name":"AOLIU","age":18] //var dict2 = ["height":1.80,"weight":"65"] as [String : Any]//如果字典中value值类型不一样就需要as如果一样就不用 ////var dict3 = ["height":1.80,"weight":65] // //for (key , value) in dict1 { //    dict2.updateValue(value, forKey: key) //} //print(dict2) //        13.元组 //        元组是Swift中特有的,OC中并没有相关类型 //        它是什么呢? //        它是一种数据结构,在数学中应用广泛 //        类似于数组或者字典 //        可以用于定义一组数据 //        组成元组类型的数据可以称为“元素” //let infoTuple = ("name",26,1.78) //infoTuple.0//"name" String //infoTuple.1// 26 Int //infoTuple.2// 1.78 Double //元组一般作为方法的多个返回值 //func test() -> (String,Int,Double) { //    return ("name",12,1.22) //} //元组可以给每一个元素起别名 //let infoTuple1 = (name:"AOLIU",age:12,height:1.66) //infoTuple1.name//AOLIU //infoTuple1.age//12 //infoTuple1.height//1.66 //let (name,age,height) = ("name",26,1.78) //name//"name" String //age// 26 Int //height// 1.78 Double //        14.可选类型(重点,难点) //        概念: //        在OC开发中,如果一个变量暂停不使用,可以赋值为0(基本属性类型)或者赋值为空(对象类型) //        在swift开发中,nil也是一个特殊的类型.因为和真实的类型不匹配是不能赋值的(swift是强类型语言) //        但是开发中赋值nil,在所难免.因此推出了可选类型 //        可选类型的取值: //        空值 //        有值 //可选类型推出的目的:对nil值进行处理 //1.定义可选类型 var name : Optional<String> = nil//方法一 var age : Int? = nil//方法二(语法糖) if age != nil {     print(age!)     print("afdaf") } print(age ?? "hahhaha") print(age as Any) //现在打印可选类型有三种方式处理 //1.强制解包    print(age!) //2.如果为空选择代替 print(age ?? "hahhaha") //3.防止报错直接让age可以为任何类型 print(age as Any) //2.给可选类型赋值 print(name ?? "d") name = "AOLIU" print(name ?? "d")//如果可选类型有值就是name,如果可选类型为nil就用??后面的代替 //3.从可选类型中取出具体的类型 //强制解包 : 可选类型 + ! print(name!) //4.可选类型注意:如果可选类型中没有值强制解包程序会崩溃 //所以:在对可选类型进行强制解包前,先判断可选类型是否等于nil if name != nil {     print(name!) } print(name ?? "kong") //5.可选绑定 //可选绑定做了两件事情 //1.判断name是否有值,如果没有(nil)大括号不会执行 //2.如果name有值,系统会将可选类型进行解包然后赋值给tempName if let tempName = name {     print(tempName) } //或 if let name = name {     print(name) } //可选类型练习: //练习一: let str = "13" let num = Int(str)//num为可选类型,因为str有可能能转为Int也有可能不能转为Int,如果不能转为Int就会为nil,所以是可选类型 print(num ?? "为空")//使用??后面的来提醒用户 if num != nil { print(num!)//通过强制解包获取num的值,但是如果num为nil就会崩溃,所以最好在强制解包之前进行判断 } print(num as Any)//将num转化为Any任何值,但是获取到的是还是一个可选类型 Optijjonal() //练习二: let path = Bundle.main.path(forResource: "123.plist", ofType: nil)//返回的是一个可选类型,因为如果bundle中没有找到123.plist就会返回nil if let path = path { NSArray(contentsOfFile: path)//这里需要传的必须是一个String(路径);但是path是可选类型,所以必须进行强制解包,解包前最好进行判断 } //练习三: let url = URL(string: "www.baidu.com") if let url = url { NSURLRequest(url: url) print(url) } let urlStr = NSURL(string: "www.baidu.com")//同练习二,返回的是可选类型 if let urlStr = urlStr { NSURLRequest(url: urlStr as URL) print(urlStr) } //15.类型转化 //常见的类型转化符号 //is : 用于判断一个实例是否是某一种类型 和OC中的isKindofClass:功能一样 //as : 将实例转成某一种类型 //as?: 转成的最终类型是一个可选类型 //as!: 转成的最终类型是一个具体类型 //is的用法 let array : [Any] = ["AOLIU",26,1.78] let ArrayM = [NSObject]() if let firstObj = array.first { if firstObj is Int { print("是Int") }else{ print("不是Int") } } //as的用法 let dict : [String : Any] = ["name" : "AOLIU", "age" : 26, "height" : 1.78] let dictM = [String : NSObject]() let value = dict["name"]//value是一个可选类型,因为可能取出来有值,可能没有值 //as?: 转成的最终类型是一个可选类型 if let value = value {//可选绑定 //将value转化为字符串 let valueStr = value as? String//valueStr还是一个可选类型,因为as?最终类型是一个可选类型 if let valueStr = valueStr {//可选绑定 print("my name is " + valueStr) } } //NSObject?转化为NSString? if let valueStr = value as? String { print("my name is " + valueStr) } //NSObject?转化为NSString //但是如果转化不成功就会崩溃 print("my name is " + (value as! String))
  • iOS

    iOS 是由苹果公司开发的移动操作系统,最早于 2007 年 1 月 9 日的 Macworld 大会上公布这个系统,最初是设计给 iPhone 使用的,后来陆续套用到 iPod touch、iPad 以及 Apple TV 等产品上。iOS 与苹果的 Mac OS X 操作系统一样,属于类 Unix 的商业操作系统。

    89 引用 • 150 回帖
  • Swift

    Swift 是苹果于 2014 年 WWDC(苹果开发者大会)发布的开发语言,可与 Objective-C 共同运行于 Mac OS 和 iOS 平台,用于搭建基于苹果平台的应用程序。

    36 引用 • 37 回帖 • 546 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • RYMCU

    RYMCU 致力于打造一个即严谨又活泼、专业又不失有趣,为数百万人服务的开源嵌入式知识学习交流平台。

    4 引用 • 6 回帖 • 56 关注
  • FreeMarker

    FreeMarker 是一款好用且功能强大的 Java 模版引擎。

    23 引用 • 20 回帖 • 468 关注
  • 服务

    提供一个服务绝不仅仅是简单的把硬件和软件累加在一起,它包括了服务的可靠性、服务的标准化、以及对服务的监控、维护、技术支持等。

    41 引用 • 24 回帖 • 2 关注
  • 心情

    心是产生任何想法的源泉,心本体会陷入到对自己本体不能理解的状态中,因为心能产生任何想法,不能分出对错,不能分出自己。

    59 引用 • 369 回帖
  • Typecho

    Typecho 是一款博客程序,它在 GPLv2 许可证下发行,基于 PHP 构建,可以运行在各种平台上,支持多种数据库(MySQL、PostgreSQL、SQLite)。

    12 引用 • 67 回帖 • 451 关注
  • NetBeans

    NetBeans 是一个始于 1997 年的 Xelfi 计划,本身是捷克布拉格查理大学的数学及物理学院的学生计划。此计划延伸而成立了一家公司进而发展这个商用版本的 NetBeans IDE,直到 1999 年 Sun 买下此公司。Sun 于次年(2000 年)六月将 NetBeans IDE 开源,直到现在 NetBeans 的社群依然持续增长。

    78 引用 • 102 回帖 • 703 关注
  • JavaScript

    JavaScript 一种动态类型、弱类型、基于原型的直译式脚本语言,内置支持类型。它的解释器被称为 JavaScript 引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在 HTML 网页上使用,用来给 HTML 网页增加动态功能。

    730 引用 • 1280 回帖 • 1 关注
  • PHP

    PHP(Hypertext Preprocessor)是一种开源脚本语言。语法吸收了 C 语言、 Java 和 Perl 的特点,主要适用于 Web 开发领域,据说是世界上最好的编程语言。

    181 引用 • 408 回帖 • 483 关注
  • Openfire

    Openfire 是开源的、基于可拓展通讯和表示协议 (XMPP)、采用 Java 编程语言开发的实时协作服务器。Openfire 的效率很高,单台服务器可支持上万并发用户。

    6 引用 • 7 回帖 • 107 关注
  • 互联网

    互联网(Internet),又称网际网络,或音译因特网、英特网。互联网始于 1969 年美国的阿帕网,是网络与网络之间所串连成的庞大网络,这些网络以一组通用的协议相连,形成逻辑上的单一巨大国际网络。

    99 引用 • 367 回帖 • 1 关注
  • 爬虫

    网络爬虫(Spider、Crawler),是一种按照一定的规则,自动地抓取万维网信息的程序。

    106 引用 • 275 回帖
  • 书籍

    宋真宗赵恒曾经说过:“书中自有黄金屋,书中自有颜如玉。”

    78 引用 • 396 回帖
  • SVN

    SVN 是 Subversion 的简称,是一个开放源代码的版本控制系统,相较于 RCS、CVS,它采用了分支管理系统,它的设计目标就是取代 CVS。

    29 引用 • 98 回帖 • 690 关注
  • OAuth

    OAuth 协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式不同之处是 oAuth 的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此 oAuth 是安全的。oAuth 是 Open Authorization 的简写。

    36 引用 • 103 回帖 • 29 关注
  • HBase

    HBase 是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的 Google 论文 “Bigtable:一个结构化数据的分布式存储系统”。就像 Bigtable 利用了 Google 文件系统所提供的分布式数据存储一样,HBase 在 Hadoop 之上提供了类似于 Bigtable 的能力。

    17 引用 • 6 回帖 • 60 关注
  • 安全

    安全永远都不是一个小问题。

    203 引用 • 818 回帖 • 2 关注
  • Kafka

    Kafka 是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据。 这种动作(网页浏览,搜索和其他用户的行动)是现代系统中许多功能的基础。 这些数据通常是由于吞吐量的要求而通过处理日志和日志聚合来解决。

    36 引用 • 35 回帖 • 2 关注
  • 人工智能

    人工智能(Artificial Intelligence)是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门技术科学。

    167 引用 • 314 回帖
  • 小说

    小说是以刻画人物形象为中心,通过完整的故事情节和环境描写来反映社会生活的文学体裁。

    32 引用 • 108 回帖
  • 资讯

    资讯是用户因为及时地获得它并利用它而能够在相对短的时间内给自己带来价值的信息,资讯有时效性和地域性。

    56 引用 • 85 回帖
  • BAE

    百度应用引擎(Baidu App Engine)提供了 PHP、Java、Python 的执行环境,以及云存储、消息服务、云数据库等全面的云服务。它可以让开发者实现自动地部署和管理应用,并且提供动态扩容和负载均衡的运行环境,让开发者不用考虑高成本的运维工作,只需专注于业务逻辑,大大降低了开发者学习和迁移的成本。

    19 引用 • 75 回帖 • 666 关注
  • SOHO

    为成为自由职业者在家办公而努力吧!

    7 引用 • 55 回帖 • 3 关注
  • HHKB

    HHKB 是富士通的 Happy Hacking 系列电容键盘。电容键盘即无接点静电电容式键盘(Capacitive Keyboard)。

    5 引用 • 74 回帖 • 504 关注
  • 学习

    “梦想从学习开始,事业从实践起步” —— 习近平

    174 引用 • 538 回帖
  • Gitea

    Gitea 是一个开源社区驱动的轻量级代码托管解决方案,后端采用 Go 编写,采用 MIT 许可证。

    5 引用 • 16 回帖 • 2 关注
  • SendCloud

    SendCloud 由搜狐武汉研发中心孵化的项目,是致力于为开发者提供高质量的触发邮件服务的云端邮件发送平台,为开发者提供便利的 API 接口来调用服务,让邮件准确迅速到达用户收件箱并获得强大的追踪数据。

    2 引用 • 8 回帖 • 498 关注
  • RabbitMQ

    RabbitMQ 是一个开源的 AMQP 实现,服务器端用 Erlang 语言编写,支持多种语言客户端,如:Python、Ruby、.NET、Java、C、PHP、ActionScript 等。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。

    49 引用 • 60 回帖 • 345 关注