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

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

之前学习了 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 的商业操作系统。

    84 引用 • 139 回帖
  • Swift

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

    34 引用 • 37 回帖 • 496 关注

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • Redis

    Redis 是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。从 2010 年 3 月 15 日起,Redis 的开发工作由 VMware 主持。从 2013 年 5 月开始,Redis 的开发由 Pivotal 赞助。

    284 引用 • 247 回帖 • 212 关注
  • Sublime

    Sublime Text 是一款可以用来写代码、写文章的文本编辑器。支持代码高亮、自动完成,还支持通过插件进行扩展。

    10 引用 • 5 回帖 • 2 关注
  • 大数据

    大数据(big data)是指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。

    89 引用 • 113 回帖
  • 深度学习

    深度学习(Deep Learning)是机器学习的分支,是一种试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高层抽象的算法。

    40 引用 • 40 回帖
  • 生活

    生活是指人类生存过程中的各项活动的总和,范畴较广,一般指为幸福的意义而存在。生活实际上是对人生的一种诠释。生活包括人类在社会中与自己息息相关的日常活动和心理影射。

    228 引用 • 1450 回帖
  • flomo

    flomo 是新一代 「卡片笔记」 ,专注在碎片化时代,促进你的记录,帮你积累更多知识资产。

    3 引用 • 74 回帖 • 2 关注
  • 架构

    我们平时所说的“架构”主要是指软件架构,这是有关软件整体结构与组件的抽象描述,用于指导软件系统各个方面的设计。另外还有“业务架构”、“网络架构”、“硬件架构”等细分领域。

    139 引用 • 441 回帖
  • 资讯

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

    53 引用 • 85 回帖 • 3 关注
  • GitHub

    GitHub 于 2008 年上线,目前,除了 Git 代码仓库托管及基本的 Web 管理界面以外,还提供了订阅、讨论组、文本渲染、在线文件编辑器、协作图谱(报表)、代码片段分享(Gist)等功能。正因为这些功能所提供的便利,又经过长期的积累,GitHub 的用户活跃度很高,在开源世界里享有深远的声望,并形成了社交化编程文化(Social Coding)。

    207 引用 • 2031 回帖
  • gRpc
    10 引用 • 8 回帖 • 48 关注
  • 一些有用的避坑指南。

    69 引用 • 93 回帖
  • sts
    2 引用 • 2 回帖 • 142 关注
  • 音乐

    你听到信仰的声音了么?

    58 引用 • 507 回帖 • 1 关注
  • 友情链接

    确认过眼神后的灵魂连接,站在链在!

    24 引用 • 373 回帖 • 7 关注
  • Hprose

    Hprose 是一款先进的轻量级、跨语言、跨平台、无侵入式、高性能动态远程对象调用引擎库。它不仅简单易用,而且功能强大。你无需专门学习,只需看上几眼,就能用它轻松构建分布式应用系统。

    9 引用 • 17 回帖 • 591 关注
  • 安装

    你若安好,便是晴天。

    128 引用 • 1183 回帖
  • Hibernate

    Hibernate 是一个开放源代码的对象关系映射框架,它对 JDBC 进行了非常轻量级的对象封装,使得 Java 程序员可以随心所欲的使用对象编程思维来操纵数据库。

    39 引用 • 103 回帖 • 676 关注
  • Mac

    Mac 是苹果公司自 1984 年起以“Macintosh”开始开发的个人消费型计算机,如:iMac、Mac mini、Macbook Air、Macbook Pro、Macbook、Mac Pro 等计算机。

    164 引用 • 594 回帖 • 1 关注
  • H2

    H2 是一个开源的嵌入式数据库引擎,采用 Java 语言编写,不受平台的限制,同时 H2 提供了一个十分方便的 web 控制台用于操作和管理数据库内容。H2 还提供兼容模式,可以兼容一些主流的数据库,因此采用 H2 作为开发期的数据库非常方便。

    11 引用 • 54 回帖 • 637 关注
  • Docker

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的操作系统上。容器完全使用沙箱机制,几乎没有性能开销,可以很容易地在机器和数据中心中运行。

    475 引用 • 899 回帖 • 1 关注
  • VirtualBox

    VirtualBox 是一款开源虚拟机软件,最早由德国 Innotek 公司开发,由 Sun Microsystems 公司出品的软件,使用 Qt 编写,在 Sun 被 Oracle 收购后正式更名成 Oracle VM VirtualBox。

    10 引用 • 2 回帖 • 1 关注
  • HBase

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

    17 引用 • 6 回帖 • 33 关注
  • SendCloud

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

    2 引用 • 8 回帖 • 429 关注
  • Node.js

    Node.js 是一个基于 Chrome JavaScript 运行时建立的平台, 用于方便地搭建响应速度快、易于扩展的网络应用。Node.js 使用事件驱动, 非阻塞 I/O 模型而得以轻量和高效。

    138 引用 • 268 回帖 • 219 关注
  • Thymeleaf

    Thymeleaf 是一款用于渲染 XML/XHTML/HTML5 内容的模板引擎。类似 Velocity、 FreeMarker 等,它也可以轻易的与 Spring 等 Web 框架进行集成作为 Web 应用的模板引擎。与其它模板引擎相比,Thymeleaf 最大的特点是能够直接在浏览器中打开并正确显示模板页面,而不需要启动整个 Web 应用。

    11 引用 • 19 回帖 • 316 关注
  • 新人

    让我们欢迎这对新人。哦,不好意思说错了,让我们欢迎这位新人!
    新手上路,请谨慎驾驶!

    50 引用 • 225 回帖
  • Spring

    Spring 是一个开源框架,是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。

    938 引用 • 1456 回帖 • 163 关注