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

本贴最后更新于 2646 天前,其中的信息可能已经斗转星移
//: 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 回帖
  • Swift

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

    34 引用 • 37 回帖 • 496 关注

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • 域名

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

    43 引用 • 208 回帖 • 1 关注
  • jsoup

    jsoup 是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址、HTML 文本内容。它提供了一套非常省力的 API,可通过 DOM,CSS 以及类似于 jQuery 的操作方法来取出和操作数据。

    6 引用 • 1 回帖 • 457 关注
  • V2EX

    V2EX 是创意工作者们的社区。这里目前汇聚了超过 400,000 名主要来自互联网行业、游戏行业和媒体行业的创意工作者。V2EX 希望能够成为创意工作者们的生活和事业的一部分。

    17 引用 • 236 回帖 • 434 关注
  • MySQL

    MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是最流行的关系型数据库管理系统之一。

    673 引用 • 535 回帖
  • 反馈

    Communication channel for makers and users.

    123 引用 • 906 回帖 • 177 关注
  • WordPress

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

    45 引用 • 113 回帖 • 321 关注
  • Love2D

    Love2D 是一个开源的, 跨平台的 2D 游戏引擎。使用纯 Lua 脚本来进行游戏开发。目前支持的平台有 Windows, Mac OS X, Linux, Android 和 iOS。

    14 引用 • 53 回帖 • 506 关注
  • SQLite

    SQLite 是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。SQLite 是全世界使用最为广泛的数据库引擎。

    4 引用 • 7 回帖 • 1 关注
  • Sym

    Sym 是一款用 Java 实现的现代化社区(论坛/BBS/社交网络/博客)系统平台。

    下一代的社区系统,为未来而构建

    522 引用 • 4581 回帖 • 687 关注
  • WebClipper

    Web Clipper 是一款浏览器剪藏扩展,它可以帮助你把网页内容剪藏到本地。

    3 引用 • 9 回帖 • 4 关注
  • 分享

    有什么新发现就分享给大家吧!

    240 引用 • 1729 回帖 • 1 关注
  • Eclipse

    Eclipse 是一个开放源代码的、基于 Java 的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。

    75 引用 • 258 回帖 • 625 关注
  • Firefox

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

    7 引用 • 30 回帖 • 458 关注
  • Electron

    Electron 基于 Chromium 和 Node.js,让你可以使用 HTML、CSS 和 JavaScript 构建应用。它是一个由 GitHub 及众多贡献者组成的活跃社区共同维护的开源项目,兼容 Mac、Windows 和 Linux,它构建的应用可在这三个操作系统上面运行。

    15 引用 • 136 回帖
  • Docker

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

    475 引用 • 899 回帖
  • DevOps

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

    37 引用 • 24 回帖 • 1 关注
  • OkHttp

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

    16 引用 • 6 回帖 • 56 关注
  • 前端

    前端技术一般分为前端设计和前端开发,前端设计可以理解为网站的视觉设计,前端开发则是网站的前台代码实现,包括 HTML、CSS 以及 JavaScript 等。

    247 引用 • 1347 回帖
  • Kafka

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

    35 引用 • 35 回帖
  • 外包

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

    26 引用 • 232 回帖 • 18 关注
  • CAP

    CAP 指的是在一个分布式系统中, Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可兼得。

    11 引用 • 5 回帖 • 552 关注
  • Ant-Design

    Ant Design 是服务于企业级产品的设计体系,基于确定和自然的设计价值观上的模块化解决方案,让设计者和开发者专注于更好的用户体验。

    17 引用 • 23 回帖
  • 黑曜石

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

    A second brain, for you, forever.

    9 引用 • 83 回帖
  • LaTeX

    LaTeX(音译“拉泰赫”)是一种基于 ΤΕΧ 的排版系统,由美国计算机学家莱斯利·兰伯特(Leslie Lamport)在 20 世纪 80 年代初期开发,利用这种格式,即使使用者没有排版和程序设计的知识也可以充分发挥由 TeX 所提供的强大功能,能在几天,甚至几小时内生成很多具有书籍质量的印刷品。对于生成复杂表格和数学公式,这一点表现得尤为突出。因此它非常适用于生成高印刷质量的科技和数学类文档。

    9 引用 • 32 回帖 • 178 关注
  • 知乎

    知乎是网络问答社区,连接各行各业的用户。用户分享着彼此的知识、经验和见解,为中文互联网源源不断地提供多种多样的信息。

    10 引用 • 66 回帖
  • 微服务

    微服务架构是一种架构模式,它提倡将单一应用划分成一组小的服务。服务之间互相协调,互相配合,为用户提供最终价值。每个服务运行在独立的进程中。服务于服务之间才用轻量级的通信机制互相沟通。每个服务都围绕着具体业务构建,能够被独立的部署。

    96 引用 • 155 回帖 • 1 关注
  • Wide

    Wide 是一款基于 Web 的 Go 语言 IDE。通过浏览器就可以进行 Go 开发,并有代码自动完成、查看表达式、编译反馈、Lint、实时结果输出等功能。

    欢迎访问我们运维的实例: https://wide.b3log.org

    30 引用 • 218 回帖 • 594 关注