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

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

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • RESTful

    一种软件架构设计风格而不是标准,提供了一组设计原则和约束条件,主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。

    30 引用 • 114 回帖
  • 开源

    Open Source, Open Mind, Open Sight, Open Future!

    396 引用 • 3416 回帖
  • Netty

    Netty 是一个基于 NIO 的客户端-服务器编程框架,使用 Netty 可以让你快速、简单地开发出一个可维护、高性能的网络应用,例如实现了某种协议的客户、服务端应用。

    49 引用 • 33 回帖 • 21 关注
  • FreeMarker

    FreeMarker 是一款好用且功能强大的 Java 模版引擎。

    23 引用 • 20 回帖 • 427 关注
  • 又拍云

    又拍云是国内领先的 CDN 服务提供商,国家工信部认证通过的“可信云”,乌云众测平台认证的“安全云”,为移动时代的创业者提供新一代的 CDN 加速服务。

    21 引用 • 37 回帖 • 513 关注
  • Mac

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

    164 引用 • 594 回帖
  • 微服务

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

    96 引用 • 155 回帖
  • V2EX

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

    17 引用 • 236 回帖 • 417 关注
  • HHKB

    HHKB 是富士通的 Happy Hacking 系列电容键盘。电容键盘即无接点静电电容式键盘(Capacitive Keyboard)。

    5 引用 • 74 回帖 • 407 关注
  • IBM

    IBM(国际商业机器公司)或万国商业机器公司,简称 IBM(International Business Machines Corporation),总公司在纽约州阿蒙克市。1911 年托马斯·沃森创立于美国,是全球最大的信息技术和业务解决方案公司,拥有全球雇员 30 多万人,业务遍及 160 多个国家和地区。

    16 引用 • 53 回帖 • 123 关注
  • 人工智能

    人工智能(Artificial Intelligence)是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门技术科学。

    75 引用 • 145 回帖 • 1 关注
  • 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.

    4 引用 • 55 回帖 • 7 关注
  • Kafka

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

    35 引用 • 35 回帖
  • Sublime

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

    10 引用 • 5 回帖
  • Solidity

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

    3 引用 • 18 回帖 • 351 关注
  • 资讯

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

    53 引用 • 85 回帖
  • TensorFlow

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

    20 引用 • 19 回帖
  • Caddy

    Caddy 是一款默认自动启用 HTTPS 的 HTTP/2 Web 服务器。

    10 引用 • 54 回帖 • 126 关注
  • 服务器

    服务器,也称伺服器,是提供计算服务的设备。由于服务器需要响应服务请求,并进行处理,因此一般来说服务器应具备承担服务并且保障服务的能力。

    124 引用 • 580 回帖
  • FFmpeg

    FFmpeg 是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。

    22 引用 • 31 回帖 • 2 关注
  • 运维

    互联网运维工作,以服务为中心,以稳定、安全、高效为三个基本点,确保公司的互联网业务能够 7×24 小时为用户提供高质量的服务。

    148 引用 • 257 回帖
  • BAE

    百度应用引擎(Baidu App Engine)提供了 PHP、Java、Python 的执行环境,以及云存储、消息服务、云数据库等全面的云服务。它可以让开发者实现自动地部署和管理应用,并且提供动态扩容和负载均衡的运行环境,让开发者不用考虑高成本的运维工作,只需专注于业务逻辑,大大降低了开发者学习和迁移的成本。

    19 引用 • 75 回帖 • 618 关注
  • NetBeans

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

    78 引用 • 102 回帖 • 643 关注
  • 大数据

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

    89 引用 • 113 回帖
  • 宕机

    宕机,多指一些网站、游戏、网络应用等服务器一种区别于正常运行的状态,也叫“Down 机”、“当机”或“死机”。宕机状态不仅仅是指服务器“挂掉了”、“死机了”状态,也包括服务器假死、停用、关闭等一些原因而导致出现的不能够正常运行的状态。

    13 引用 • 82 回帖 • 38 关注
  • JavaScript

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

    710 引用 • 1173 回帖 • 171 关注
  • 钉钉

    钉钉,专为中国企业打造的免费沟通协同多端平台, 阿里巴巴出品。

    15 引用 • 67 回帖 • 370 关注