//方法部分

import UIKit

//方法(Methods)

/*方法是与某些特定类型相关联的函数,类、结构体、枚举都可以定义实例方法

实例方法(Instance Methods):

1.属于某个特定类、结构体或者枚举类型的实例的方法,提供访问和修改实例属性的方法或提供与实例目的相关的功能

2.只能被它所属的类的某个特定实例调用。实例方法不能脱离于现存的实例而被调用。

类型方法(Type Methods):通过类型本身调用的方法(static func ...)

1.声明结构体和枚举的类型方法,在方法的func关键字之前加上关键字static。类可能会用关键字class来允许子类重写父类的方法实现

2.在类型方法的方法体(body)中,self指向这个类型本身,而不是类型的某个实例

3.在类型方法的方法体中,任何未限定的方法和属性名称,将会指代本类中的类型方法和类型属性,即:一个类型方法中可以直接通过类型方法、类型属性的名称调用本类中的类型方法、类型属性,而无需在方法、属性名称前面加上类型名称前缀(无需通过点语法调用),而非类型方法则需要加类型名称前缀

方法的局部参数名称和外部参数名称 (Local and External Parameter Names for Methods):

1.默认仅给方法的第一个参数名称为局部参数;默认同时给第二个和后续的参数名称为局部参数名称和外部参数名称

2.可以为一个参数添加一个显式的外部名称,可以通过"_"省略第二个和之后的参数的外部名称

self属性:

1.类型的每一个实例都有一个隐含属性叫做self,self完全等同于该实例本身

2.实例方法的某个参数名称与实例的某个属性名称相同的时候,参数名称享有优先权,并且在引用属性时必须使用"self.属性"来区分属性名称和参数名称。

变异方法(mutating methods):(类class类型为引用类型,默认的方法即为可变方法,为值类型定义的变异方法其实就是将该方法定义为可以像类class类型方法一样使用)

1.定义在结构体和枚举等的值类型中,因为结构体和枚举是值类型,不能通过普通方法更改值类型的实例的属性

2.通过加关键字mutating定义变异方法,可以在方法内部改变它的属性;并且它做的任何改变在方法结束时还会保留在该实例结构中。

3.方法还可以给它隐含的self属性赋值一个全新的实例,这个新实例在方法结束后将替换原来的实例*/

class Counter {

var count: Int = 0

func incrementBy(count:Int) {    //使用"self.属性"来区分属性名称和参数名称

self.count += count

}

func incrementBy1(amount: Int,numberOfTimes: Int) {

count += amount * numberOfTimes

}

func incrementBy2(number amount: Int,_ numberOfTimes: Int) {  //为第一个参数添加一个显式的外部名称,通过"_"调用时可以省略参数的外部名称

count += amount * numberOfTimes

}

}

let counter1 = Counter()

let counter2 = counter1  //此处counter2 === counter1 ,引用了同一个类的实例

counter1.incrementBy1(5,numberOfTimes:3)  //默认第一个参数为局部参数,第二和之后的参数为局部和外部参数(必须带参数名字)

print(counter1.count)

counter2.incrementBy2(number: 4, 6)

//执行计算:15+4*6

print(counter2.count)

//=============结构体和枚举的变异方法(mutating methods)======

struct Point {

var x = 0.0, y = 0.0

mutating func moveByX1(deltaX: Double, y deltaY: Double) {

x += deltaX

y += deltaY

}

mutating func createBy(deltaX: Double, y deltaY: Double) {

self = Point(x: x + deltaX, y: y + deltaY)      //通过给实例的self属性赋值,来改变原实例

}

}

var somePoint1 = Point(x: 1.0, y: 1.0)

var somePoint2 = somePoint1    //因为是结构体,somePoint2接收的值是somePoint1的值的拷贝,之后修改somePoint1不影响somePoint2

somePoint1.moveByX1(2.0, y: 3.0)   //调用变异方法moveByx1更改了实例somePoint1的属性值(调用mutating方法时,将结构体struct当着类class来处理)

var somePoint3 = somePoint1

somePoint1.createBy(8.0, y: 9.0)  //变异方法通过给实例的self属性赋值一个全新的实例,并用该新实例替换了旧实例

print("point1 = (\(somePoint1.x), \(somePoint1.y)) , point2 = (\(somePoint2.x), \(somePoint2.y)) , point3 = (\(somePoint3.x), \(somePoint3.y))"

enum TriStateSwitch {

case Off, Low, High

mutating func next() {

switch self {

case Off:

self = Low

case Low:

self = High

case High:

self = Off

}

}

}

var ovenLight = TriStateSwitch.Low

ovenLight.next()

// ovenLight 现在等于 .High

ovenLight.next()

// ovenLight 现在等于 .Off

//=========类型方法=============

struct LevelTracker {

static var highestUnlockedLevel = 1     //类型属性

static func unlockLevel(level: Int) {   //类型方法

if level > highestUnlockedLevel { highestUnlockedLevel = level }   //直接用类型属性名称调用,无需加前缀

}

static func levelIsUnlocked(level: Int) -> Bool {

return level <= highestUnlockedLevel

}

var currentLevel = 1

mutating func advanceToLevel(level: Int) -> Bool {     //变异方法

if LevelTracker.levelIsUnlocked(level) {        //非类型方法中,调用类型方法需加前缀

currentLevel = level

return true

} else {

return false

}

}

}

class Player {

var tracker = LevelTracker()

let playerName: String

func completedLevel(level: Int) {

LevelTracker.unlockLevel(level + 1)

tracker.advanceToLevel(level + 1)

}

init(name: String) {

playerName = name

}

}

var player = Player(name: "Argyrios")

player.completedLevel(1)

print("highest unlocked level is now \(LevelTracker.highestUnlockedLevel)")

// 打印输出:highest unlocked level is now 2

player = Player(name: "Beto")

if player.tracker.advanceToLevel(6) {

print("player is now on level 6")

} else {

print("level 6 has not yet been unlocked")

}

// 打印输出:level 6 has not yet been unlocked

swift学习笔记之-方法部分的更多相关文章

  1. Swift学习笔记(14)--方法

    1.分类 方法分为实例方法和类型方法 实例方法(Instance Methods):与java中的类似,略 类型方法(Type Methods):与java.oc中的类方法类似.声明类的类型方法,在方 ...

  2. swift学习笔记之--方法

    一.说明 跟oc一样,面向对象,swift重点额方法可以分为2大类: (1)实例方法 oc中为减号方法(对象方法) (2)类型方法 oc中的加号方法(类方法) 二.实例方法 只能是对象调用的方法 代码 ...

  3. 【swift学习笔记】二.页面转跳数据回传

    上一篇我们介绍了页面转跳:[swift学习笔记]一.页面转跳的条件判断和传值 这一篇说一下如何把数据回传回父页面,如下图所示,这个例子很简单,只是把传过去的数据加上了"回传"两个字 ...

  4. Swift学习笔记(一)搭配环境以及代码运行成功

    原文:Swift学习笔记(一)搭配环境以及代码运行成功 1.Swift是啥? 百度去!度娘告诉你它是苹果最新推出的编程语言,比c,c++,objc要高效简单.能够开发ios,mac相关的app哦!是苹 ...

  5. Java学习笔记之---方法和数组

    Java学习笔记之---方法与数组 (一)方法 (1)什么是方法? 方法是解决一类问题的步骤的有序组合 方法包含于类或对象中 方法在程序中被创建,在其他地方被引用 (2)方法的优点 使程序变得更简短而 ...

  6. swift学习笔记5——其它部分(自动引用计数、错误处理、泛型...)

    之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...

  7. swift学习笔记4——扩展、协议

    之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...

  8. swift学习笔记3——类、结构体、枚举

    之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...

  9. swift学习笔记1——基础部分

    之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...

随机推荐

  1. 使用Nginx配置NodeJs程序(Windows平台)

    简介 Nginx("engine x") 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 服务器. Nginx 是由 Igor Sysoev ...

  2. 数据可视化(1)--Chart.js

    Chart.js是一个HTML5图表库,使用canvas元素来展示各式各样的客户端图表,支持折线图.柱形图.雷达图.饼图.环形图等.在每种图表中,还包含了大量的自定义选项,包括动画展示形式. Char ...

  3. c#编码规范

    1  规范目的 --------------------- 3 2  适用范围 --------------------- 3 3  代码注释 --------------------- 3 3.1  ...

  4. 硬刚Google ,这家小公司的增长团队长啥样

    背景: AdRoll 是一家主打重定向广告(Retargeting)服务的技术公司,基于用户浏览记录等信息,为广告主提供几乎瞬时的广告位购买服务,当前估值15.5亿美元.吊打谷歌, AdRoll 已经 ...

  5. 用jQuery重置用于文件上传的input (type="file")

    页面中有如下标签: <input type="file" id="upload"/> 此标签本用于文件上传,现在有需要将其值重置为空.于是想当然地写 ...

  6. 机器学习&数据挖掘笔记_23(PGM练习七:CRF中参数的学习)

    前言: 本次实验主要任务是学习CRF模型的参数,实验例子和PGM练习3中的一样,用CRF模型来预测多张图片所组成的单词,我们知道在graph model的推理中,使用较多的是factor,而在grap ...

  7. WPF依赖属性详解

    WPF依赖属性详解 WPF 依赖属性 英文译为 Dependency Properties,是WPF引入的一种新类型的属性,在WPF中有着极为广泛的应用,在WPF中对于WPF Dependency P ...

  8. C#实现WinForm窗体逐渐显示效果

    C#实现WinForm窗体逐渐显示效果,这个博客园里面已经有其它人已经实现了,原理很简单,就是通过定时改变窗体的透明度(从0到1,即透明度从完全透明到不透明),我这里也是按照这个思路来实现的,但是我做 ...

  9. 说说我在项目中为什么不用实体框架,如果说我在诋毁你所爱的EF,请进来.

    1.坑多. 这一点没有人会否定.当然你可以说你很牛,但事实不会因为你牛就可以说不存在.从博客园中的博问中大家关于EF的提问量就问题的怪异程度就可以看出来. 1.Entity Framework 查询历 ...

  10. Js位置与大小(1)——正确理解和运用与尺寸大小相关的DOM属性

    在web开发中,不可避免遇到要计算元素大小以及位置的问题,解决这类问题的方法是利用DOM提供的一些API结合兼容性处理来,所有内容大概分3篇左右的文章的来说明.本文作为第一篇,介绍DOM提供的与尺寸大 ...