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

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

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

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

    34 引用 • 37 回帖 • 510 关注

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • Openfire

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

    6 引用 • 7 回帖 • 94 关注
  • 倾城之链
    23 引用 • 66 回帖 • 120 关注
  • 996
    13 引用 • 200 回帖 • 6 关注
  • Tomcat

    Tomcat 最早是由 Sun Microsystems 开发的一个 Servlet 容器,在 1999 年被捐献给 ASF(Apache Software Foundation),隶属于 Jakarta 项目,现在已经独立为一个顶级项目。Tomcat 主要实现了 JavaEE 中的 Servlet、JSP 规范,同时也提供 HTTP 服务,是市场上非常流行的 Java Web 容器。

    162 引用 • 529 回帖
  • 博客

    记录并分享人生的经历。

    272 引用 • 2386 回帖
  • CodeMirror
    1 引用 • 2 回帖 • 125 关注
  • Bug

    Bug 本意是指臭虫、缺陷、损坏、犯贫、窃听器、小虫等。现在人们把在程序中一些缺陷或问题统称为 bug(漏洞)。

    71 引用 • 1737 回帖 • 1 关注
  • jsDelivr

    jsDelivr 是一个开源的 CDN 服务,可为 npm 包、GitHub 仓库提供免费、快速并且可靠的全球 CDN 加速服务。

    5 引用 • 31 回帖 • 51 关注
  • Kafka

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

    35 引用 • 35 回帖
  • 脑图

    脑图又叫思维导图,是表达发散性思维的有效图形思维工具 ,它简单却又很有效,是一种实用性的思维工具。

    21 引用 • 58 回帖
  • SOHO

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

    7 引用 • 55 回帖 • 65 关注
  • GitLab

    GitLab 是利用 Ruby 一个开源的版本管理系统,实现一个自托管的 Git 项目仓库,可通过 Web 界面操作公开或私有项目。

    46 引用 • 72 回帖
  • JavaScript

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

    713 引用 • 1174 回帖 • 104 关注
  • Bootstrap

    Bootstrap 是 Twitter 推出的一个用于前端开发的开源工具包。它由 Twitter 的设计师 Mark Otto 和 Jacob Thornton 合作开发,是一个 CSS / HTML 框架。

    18 引用 • 33 回帖 • 680 关注
  • Android

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

    334 引用 • 323 回帖 • 19 关注
  • 面试

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

    324 引用 • 1395 回帖
  • 正则表达式

    正则表达式(Regular Expression)使用单个字符串来描述、匹配一系列遵循某个句法规则的字符串。

    31 引用 • 94 回帖
  • 黑曜石

    黑曜石是一款强大的知识库工具,支持本地 Markdown 文件编辑,支持双向链接和关系图。

    A second brain, for you, forever.

    10 引用 • 88 回帖
  • Postman

    Postman 是一款简单好用的 HTTP API 调试工具。

    4 引用 • 3 回帖 • 5 关注
  • abitmean

    有点意思就行了

    38 关注
  • Logseq

    Logseq 是一个隐私优先、开源的知识库工具。

    Logseq is a joyful, open-source outliner that works on top of local plain-text Markdown and Org-mode files. Use it to write, organize and share your thoughts, keep your to-do list, and build your own digital garden.

    5 引用 • 62 回帖
  • NGINX

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

    311 引用 • 546 回帖 • 1 关注
  • 星云链

    星云链是一个开源公链,业内简单的将其称为区块链上的谷歌。其实它不仅仅是区块链搜索引擎,一个公链的所有功能,它基本都有,比如你可以用它来开发部署你的去中心化的 APP,你可以在上面编写智能合约,发送交易等等。3 分钟快速接入星云链 (NAS) 测试网

    3 引用 • 16 回帖 • 1 关注
  • Hprose

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

    9 引用 • 17 回帖 • 600 关注
  • 学习

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

    163 引用 • 473 回帖
  • Firefox

    Mozilla Firefox 中文俗称“火狐”(正式缩写为 Fx 或 fx,非正式缩写为 FF),是一个开源的网页浏览器,使用 Gecko 排版引擎,支持多种操作系统,如 Windows、OSX 及 Linux 等。

    7 引用 • 30 回帖 • 429 关注
  • PHP

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

    165 引用 • 407 回帖 • 510 关注