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

本贴最后更新于 3053 天前,其中的信息可能已经斗转星移
//: Playground - noun: a place where people can play import UIKit // 1.函数 //function 函数名 (参数列表) -> 返回值类型 {函数体} //函数相当于OC中的方法 //函数的格式如下 //func 函数名(参数列表) -> 返回值类型 { // 代码块 // return 返回值 //} //func是关键字,多个参数列表之间可以用逗号(,)分隔,也可以没有参数 //使用箭头“->”指向返回值类型 //如果函数没有返回值,返回值为Void.并且“-> 返回值类型”部分可以省略 //1),没参数没有返回值的函数 func eat () -> Void { print("apple") } //或者 //func run () { // print("apple") //} //调用 eat() //2),有参数没有返回值的函数 func eat (food : String) { // print("吃" + food) print("chi \(food)") } eat(food: "banana") //3),没参数没有返回值的函数 func message() -> String{ return "你还好吗?" } print(message()) //4),有参数有返回值的函数 func sum(num1 : Int,num2 : Int) -> Int { return num1 + num2; } let total = sum(num1 : 10, num2 : 30) print(total) //5).有参数并且有多个返回值 let array = [12,33,45,22,44,23] func getnumbers(nums : [Int]) -> (Int, Int) { var oddCount = 0 var eventCount = 0 for item in nums { if item % 2 == 0 { eventCount += 1 }else{ oddCount += 1 } } return (eventCount, oddCount) } let count = getnumbers(nums: array) print("偶数的个数为:\(count.0),奇数的个数为:\(count.1)") // 2.函数的使用注意 //注意一: //swift3.0之前外部参数和内部参数 //在函数内部可以看到的参数,就是内部参数 //在函数外面可以看到的参数,就是外部参数 //默认情况下,从第二个参数开始,参数名称既是内部参数也是外部参数 //如果第一个参数也想要有外部参数,可以设置标签:在变量名前加标签即可 //如果不想要外部参数,可以在参数名称前加_ //func sum1(num1 num1 : Int,num2 : Int) -> Int { // return num1 + num2; //} //print(sum1(num1: 1, num2: 1)) //swift3.0之后没有外部和内部参数的区别都是外部参数 func sum2(num1 : Int,num2 : Int) -> Int { return num1 + num2; } print(sum2(num1: 1, num2: 1))//2 func sum3(_ num1 : Int,_ num2 : Int) -> Int { return num1 + num2; } print(sum3(1, 1))//2 //注意二: 默认参数 //某些情况,如果没有传入具体的参数,可以使用默认参数 func eats(food: String = "li") -> String { return("吃 \(food)") } eats(food: "苹果") eats(food: "香蕉") eats() //注意三: 可变参数 //swift中函数的参数个数可以变化,它可以接受不确定数量的输入类型参数 //它们必须具有相同的类型 //我们可以通过在参数类型名后面加入(...)的方式来指示这是可变参数 func sum4(nums : Int...) -> Int { var result = 0 for num in nums { result += num } return result } sum4(nums: 1,2,3,4,5) //注意四: 引用类型(指针的传递) //默认情况下,函数的参数是值传递.如果想改变外面的变量,则需要传递变量的地址 //必须是变量,因为需要在内部改变其值 //Swift提供的inout关键字就可以实现 //swift3.0之前在num1之前,现在是在类型之前 //对比下列两个函数 var a = 10 var b = 20 //func exchangeNum(inout num1: Int,inout num2: Int) { // let tempNum = num1 // num1 = num2 // num2 = tempNum //} func exchangeNum( num1: inout Int, num2: inout Int) { let tempNum = num1 num1 = num2 num2 = tempNum } exchangeNum(num1: &a, num2: &b) print(a) print(b) //注意五:函数的嵌套使用 //swift中函数可以嵌套使用 //即函数中包含函数,但是不推荐该写法 // 3.函数的类型 //函数类型的概念 //每个函数都有属于自己的类型,由函数的参数类型和返回类型组成 //这个例子中定义了两个简单的数学函数:addTwoInts 和 multiplyTwoInts //这两个函数都传入两个 Int 类型, 返回一个合适的Int值 //这两个函数的类型是 (Int, Int) -> Int // 定义两个函数 func addTwoInts(a : Int, b : Int) -> Int { return a + b } func multiplyTwoInt(a : Int, b : Int) -> Int { return a * b } // 定义函数的类型 var mathFunction : (Int, Int) -> Int = addTwoInts // 使用函数的名称 print(mathFunction(10, 20))//30 // 给函数的标识符赋值其他值 print(mathFunction = multiplyTwoInt) // 使用函数的名称 print(mathFunction(10, 20))//200 //1.函数作为方法的参数 func printResult(a : Int, b : Int, calculateMethod : (Int, Int) -> Int) { print(calculateMethod(a, b)) } printResult(a: 10, b: 20, calculateMethod: addTwoInts)//30 printResult(a: 10, b: 20, calculateMethod: multiplyTwoInt)//200 //2.函数作为方法的返回值 // 1.定义两个函数 func stepForward(num : Int) -> Int { return num + 1 } func stepBackward(num : Int) -> Int { return num - 1 } // 2.定义一个变量,希望该变量经过计算得到0 var num = -4 // 3.定义获取哪一个函数 func getOprationMethod(num : Int) -> ((Int) -> Int) { return num <= 0 ? stepForward : stepBackward } // 4.for进行操作 while num != 0 { let oprationMethod = getOprationMethod(num: num) num = oprationMethod(num) print(num) } // 4.枚举类型 //枚举类型的介绍 //概念介绍 //枚举定义了一个通用类型的一组相关的值,使你可以在你的代码中以一个安全的方式来使用这些值。 //在 C/OC 语言中枚举指定相关名称为一组整型值 //Swift 中的枚举更加灵活,不必给每一个枚举成员提供一个值.也可以提供一个值是字符串,一个字符,或是一个整型值或浮点值 //枚举类型的语法 //使用enum关键词并且把它们的整个定义放在一对大括号内 //enum SomeEnumeration { // // enumeration definition goes here //} // 1.枚举类型的定义 //case关键词表明新的一行成员值将被定义 //不像 C 和 Objective-C 一样,Swift 的枚举成员在被创建时不会被赋予一个默认的整数值 //在下面的CompassPoints例子中,North,South,East和West不是隐式的等于0,1,2和3 enum CompassPoint { case North case South case East case West } //定义方式二:多个成员值可以出现在同一行上 enum Planet { case Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune } //2.给枚举类型赋值 //枚举类型赋值可以是字符串/字符/整型/浮点型 //注意如果有给枚举类型赋值,则必须在枚举类型后面明确说明具体的类型 enum CompassPoint1 : Int{ case North = 1 case South = 2 case East = 3 case West = 4 } let direction = CompassPoint1.North let direction1 : CompassPoint1 = .East let direction2 = CompassPoint1(rawValue: 5)//返回的是一个可选类型 //let direction2 = .West //错误 // 5.结构体 //结构体的介绍 //概念介绍 //结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合 //结构体(struct)指的是一种数据结构 //结构体是值类型,在方法中传递时是值传递 //结构的定义格式 //struct 结构体名称 { // // 属性和方法 //swift即可以写熟悉还可以写方法 //} //5.1定义结构体 struct Location { var x : Double var y : Double } //5.2通过结构体构建点 let center = Location(x: 100, y: 100) print(center) //5.3测试点的位置 let testLocation = Location(x: 50, y: 50) //5.4求测试点是否在以center为中心半径为100的园内 func inRange(location : Location) -> Bool { let disX = location.x - center.x let disY = location.y - center.y let distance = sqrt((pow(disX, 2) + pow(disY, 2))) return distance < 200 } inRange(location: testLocation) //5.5结构体的增强 //扩充构造函数 //默认情况下创建Location时使用Location(x: x值, y: y值) //但是为了让我们在使用结构体时更加的灵活,swift还可以对构造函数进行扩充 //注意: //1.在实例化任何一个类或者结构体时,必须保证类/构造体所有的(存储)属性,都必须初始化 //2.如果自定了构造函数,那么会覆盖系统提供的构造函数,如果想继续使用原来的构造函数就必须明确的重写系统的构造函数 let point = CGRect(x: 10, y: 10, width: 10, height: 10) struct Position { var x : Double var y : Double // // var x : Double = 100 // var y : Double = 200 init(x : Double, y : Double) {//默认的构造函数 self.x = x self.y = y } init() { x = 100 y = 200 } } let position = Position(x: 10, y: 20) let p = Position() print(position) //5.6为结构体扩充方法 //为了让结构体使用更加灵活,swift的结构体中可以扩充方法,要想扩充方法一般在方法前面加mutating //例子:为了Location结构体扩充两个方法 //向水平方向移动的方法 //向垂直方向移动的方法 struct Location2 { var x : Double var y : Double init(x : Double, y : Double) { self.x = x self.y = y } init(xyString : String) { let strs = xyString.components(separatedBy: ",") x = Double(strs.first!)! y = Double(strs.last!)!// y = Double(strs[1])!strs[1]这种方法取返回的是一个具体类型不是可选类型,如果这样做需要做判断防止越界,系统在这里做的不很好 } func eat(){ print("chi") } mutating func moveH(x : Double) { self.x += x } mutating func moveV(y : Double) { self.y += y } } var location2 = Location2(xyString: "2,2") print(location2) location2.eat() location2.moveH(x: 10) print(location2) //5.7注意: //可以通过extension给系统的类/结构体扩充方法 extension CGPoint { mutating func moveH(x : CGFloat) { self.x += x } mutating func moveV(y : CGFloat) { self.y += y } }
  • 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 关注

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • OpenStack

    OpenStack 是一个云操作系统,通过数据中心可控制大型的计算、存储、网络等资源池。所有的管理通过前端界面管理员就可以完成,同样也可以通过 Web 接口让最终用户部署资源。

    10 引用 • 5 关注
  • 外包

    有空闲时间是接外包好呢还是学习好呢?

    26 引用 • 233 回帖 • 2 关注
  • BND

    BND(Baidu Netdisk Downloader)是一款图形界面的百度网盘不限速下载器,支持 Windows、Linux 和 Mac,详细介绍请看这里

    107 引用 • 1281 回帖 • 32 关注
  • Telegram

    Telegram 是一个非盈利性、基于云端的即时消息服务。它提供了支持各大操作系统平台的开源的客户端,也提供了很多强大的 APIs 给开发者创建自己的客户端和机器人。

    5 引用 • 35 回帖
  • JWT

    JWT(JSON Web Token)是一种用于双方之间传递信息的简洁的、安全的表述性声明规范。JWT 作为一个开放的标准(RFC 7519),定义了一种简洁的,自包含的方法用于通信双方之间以 JSON 的形式安全的传递信息。

    20 引用 • 15 回帖 • 22 关注
  • OAuth

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

    36 引用 • 103 回帖 • 29 关注
  • gRpc
    11 引用 • 9 回帖 • 89 关注
  • 大疆创新

    深圳市大疆创新科技有限公司(DJI-Innovations,简称 DJI),成立于 2006 年,是全球领先的无人飞行器控制系统及无人机解决方案的研发和生产商,客户遍布全球 100 多个国家。通过持续的创新,大疆致力于为无人机工业、行业用户以及专业航拍应用提供性能最强、体验最佳的革命性智能飞控产品和解决方案。

    2 引用 • 14 回帖
  • Notion

    Notion - The all-in-one workspace for your notes, tasks, wikis, and databases.

    10 引用 • 77 回帖
  • Q&A

    提问之前请先看《提问的智慧》,好的问题比好的答案更有价值。

    9733 引用 • 44280 回帖 • 89 关注
  • Sandbox

    如果帖子标签含有 Sandbox ,则该帖子会被视为“测试帖”,主要用于测试社区功能,排查 bug 等,该标签下内容不定期进行清理。

    432 引用 • 1250 回帖 • 596 关注
  • 域名

    域名(Domain Name),简称域名、网域,是由一串用点分隔的名字组成的 Internet 上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位(有时也指地理位置)。

    43 引用 • 208 回帖
  • SEO

    发布对别人有帮助的原创内容是最好的 SEO 方式。

    35 引用 • 200 回帖 • 29 关注
  • DevOps

    DevOps(Development 和 Operations 的组合词)是一组过程、方法与系统的统称,用于促进开发(应用程序/软件工程)、技术运营和质量保障(QA)部门之间的沟通、协作与整合。

    58 引用 • 25 回帖 • 2 关注
  • SOHO

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

    7 引用 • 55 回帖 • 3 关注
  • 小薇

    小薇是一个用 Java 写的 QQ 聊天机器人 Web 服务,可以用于社群互动。

    由于 Smart QQ 从 2019 年 1 月 1 日起停止服务,所以该项目也已经停止维护了!

    35 引用 • 468 回帖 • 764 关注
  • 阿里云

    阿里云是阿里巴巴集团旗下公司,是全球领先的云计算及人工智能科技公司。提供云服务器、云数据库、云安全等云计算服务,以及大数据、人工智能服务、精准定制基于场景的行业解决方案。

    84 引用 • 324 回帖
  • RIP

    愿逝者安息!

    8 引用 • 92 回帖 • 400 关注
  • 面试

    面试造航母,上班拧螺丝。多面试,少加班。

    325 引用 • 1395 回帖 • 1 关注
  • TensorFlow

    TensorFlow 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库。节点(Nodes)在图中表示数学操作,图中的线(edges)则表示在节点间相互联系的多维数据数组,即张量(tensor)。

    20 引用 • 19 回帖 • 3 关注
  • OkHttp

    OkHttp 是一款 HTTP & HTTP/2 客户端库,专为 Android 和 Java 应用打造。

    16 引用 • 6 回帖 • 84 关注
  • 强迫症

    强迫症(OCD)属于焦虑障碍的一种类型,是一组以强迫思维和强迫行为为主要临床表现的神经精神疾病,其特点为有意识的强迫和反强迫并存,一些毫无意义、甚至违背自己意愿的想法或冲动反反复复侵入患者的日常生活。

    15 引用 • 161 回帖 • 1 关注
  • 职场

    找到自己的位置,萌新烦恼少。

    127 引用 • 1708 回帖
  • CSS

    CSS(Cascading Style Sheet)“层叠样式表”是用于控制网页样式并允许将样式信息与网页内容分离的一种标记性语言。

    199 引用 • 542 回帖
  • 工具

    子曰:“工欲善其事,必先利其器。”

    298 引用 • 763 回帖
  • etcd

    etcd 是一个分布式、高可用的 key-value 数据存储,专门用于在分布式系统中保存关键数据。

    6 引用 • 26 回帖 • 544 关注
  • 国际化

    i18n(其来源是英文单词 internationalization 的首末字符 i 和 n,18 为中间的字符数)是“国际化”的简称。对程序来说,国际化是指在不修改代码的情况下,能根据不同语言及地区显示相应的界面。

    8 引用 • 26 回帖 • 3 关注