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

本贴最后更新于 3011 天前,其中的信息可能已经斗转星移
//: 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 的商业操作系统。

    87 引用 • 139 回帖 • 1 关注
  • Swift

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

    36 引用 • 37 回帖 • 545 关注

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • Android

    Android 是一种以 Linux 为基础的开放源码操作系统,主要使用于便携设备。2005 年由 Google 收购注资,并拉拢多家制造商组成开放手机联盟开发改良,逐渐扩展到到平板电脑及其他领域上。

    335 引用 • 324 回帖
  • Laravel

    Laravel 是一套简洁、优雅的 PHP Web 开发框架。它采用 MVC 设计,是一款崇尚开发效率的全栈框架。

    20 引用 • 23 回帖 • 737 关注
  • RYMCU

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

    4 引用 • 6 回帖 • 53 关注
  • NGINX

    NGINX 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。 NGINX 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,第一个公开版本 0.1.0 发布于 2004 年 10 月 4 日。

    315 引用 • 547 回帖
  • Anytype
    3 引用 • 31 回帖 • 12 关注
  • Windows

    Microsoft Windows 是美国微软公司研发的一套操作系统,它问世于 1985 年,起初仅仅是 Microsoft-DOS 模拟环境,后续的系统版本由于微软不断的更新升级,不但易用,也慢慢的成为家家户户人们最喜爱的操作系统。

    226 引用 • 476 回帖 • 2 关注
  • NetBeans

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

    78 引用 • 102 回帖 • 702 关注
  • 30Seconds

    📙 前端知识精选集,包含 HTML、CSS、JavaScript、React、Node、安全等方面,每天仅需 30 秒。

    • 精选常见面试题,帮助您准备下一次面试
    • 精选常见交互,帮助您拥有简洁酷炫的站点
    • 精选有用的 React 片段,帮助你获取最佳实践
    • 精选常见代码集,帮助您提高打码效率
    • 整理前端界的最新资讯,邀您一同探索新世界
    488 引用 • 384 回帖 • 6 关注
  • 职场

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

    127 引用 • 1708 回帖
  • flomo

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

    6 引用 • 140 回帖
  • 电影

    这是一个不能说的秘密。

    122 引用 • 608 回帖
  • 智能合约

    智能合约(Smart contract)是一种旨在以信息化方式传播、验证或执行合同的计算机协议。智能合约允许在没有第三方的情况下进行可信交易,这些交易可追踪且不可逆转。智能合约概念于 1994 年由 Nick Szabo 首次提出。

    1 引用 • 11 回帖 • 1 关注
  • LeetCode

    LeetCode(力扣)是一个全球极客挚爱的高质量技术成长平台,想要学习和提升专业能力从这里开始,充足技术干货等你来啃,轻松拿下 Dream Offer!

    209 引用 • 72 回帖
  • Q&A

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

    9409 引用 • 42877 回帖 • 110 关注
  • ZooKeeper

    ZooKeeper 是一个分布式的,开放源码的分布式应用程序协调服务,是 Google 的 Chubby 一个开源的实现,是 Hadoop 和 HBase 的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。

    59 引用 • 29 回帖 • 2 关注
  • Flutter

    Flutter 是谷歌的移动 UI 框架,可以快速在 iOS 和 Android 上构建高质量的原生用户界面。 Flutter 可以与现有的代码一起工作,它正在被越来越多的开发者和组织使用,并且 Flutter 是完全免费、开源的。

    39 引用 • 92 回帖 • 1 关注
  • B3log

    B3log 是一个开源组织,名字来源于“Bulletin Board Blog”缩写,目标是将独立博客与论坛结合,形成一种新的网络社区体验,详细请看 B3log 构思。目前 B3log 已经开源了多款产品:SymSoloVditor思源笔记

    1063 引用 • 3455 回帖 • 165 关注
  • Quicker

    Quicker 您的指尖工具箱!操作更少,收获更多!

    36 引用 • 155 回帖 • 2 关注
  • Solidity

    Solidity 是一种智能合约高级语言,运行在 [以太坊] 虚拟机(EVM)之上。它的语法接近于 JavaScript,是一种面向对象的语言。

    3 引用 • 18 回帖 • 431 关注
  • MongoDB

    MongoDB(来自于英文单词“Humongous”,中文含义为“庞大”)是一个基于分布式文件存储的数据库,由 C++ 语言编写。旨在为应用提供可扩展的高性能数据存储解决方案。MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似 JSON 的 BSON 格式,因此可以存储比较复杂的数据类型。

    90 引用 • 59 回帖 • 6 关注
  • Vue.js

    Vue.js(读音 /vju ː/,类似于 view)是一个构建数据驱动的 Web 界面库。Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。

    267 引用 • 666 回帖 • 1 关注
  • 微信

    腾讯公司 2011 年 1 月 21 日推出的一款手机通讯软件。用户可以通过摇一摇、搜索号码、扫描二维码等添加好友和关注公众平台,同时可以将自己看到的精彩内容分享到微信朋友圈。

    132 引用 • 796 回帖
  • Spark

    Spark 是 UC Berkeley AMP lab 所开源的类 Hadoop MapReduce 的通用并行框架。Spark 拥有 Hadoop MapReduce 所具有的优点;但不同于 MapReduce 的是 Job 中间输出结果可以保存在内存中,从而不再需要读写 HDFS,因此 Spark 能更好地适用于数据挖掘与机器学习等需要迭代的 MapReduce 的算法。

    74 引用 • 46 回帖 • 567 关注
  • Outlook
    1 引用 • 5 回帖
  • Excel
    31 引用 • 28 回帖
  • WordPress

    WordPress 是一个使用 PHP 语言开发的博客平台,用户可以在支持 PHP 和 MySQL 数据库的服务器上架设自己的博客。也可以把 WordPress 当作一个内容管理系统(CMS)来使用。WordPress 是一个免费的开源项目,在 GNU 通用公共许可证(GPLv2)下授权发布。

    66 引用 • 114 回帖 • 200 关注
  • SMTP

    SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。SMTP 协议属于 TCP/IP 协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。

    4 引用 • 18 回帖 • 637 关注