swift学习笔记之-方法部分
//方法部分
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学习笔记之-方法部分的更多相关文章
- Swift学习笔记(14)--方法
1.分类 方法分为实例方法和类型方法 实例方法(Instance Methods):与java中的类似,略 类型方法(Type Methods):与java.oc中的类方法类似.声明类的类型方法,在方 ...
- swift学习笔记之--方法
一.说明 跟oc一样,面向对象,swift重点额方法可以分为2大类: (1)实例方法 oc中为减号方法(对象方法) (2)类型方法 oc中的加号方法(类方法) 二.实例方法 只能是对象调用的方法 代码 ...
- 【swift学习笔记】二.页面转跳数据回传
上一篇我们介绍了页面转跳:[swift学习笔记]一.页面转跳的条件判断和传值 这一篇说一下如何把数据回传回父页面,如下图所示,这个例子很简单,只是把传过去的数据加上了"回传"两个字 ...
- Swift学习笔记(一)搭配环境以及代码运行成功
原文:Swift学习笔记(一)搭配环境以及代码运行成功 1.Swift是啥? 百度去!度娘告诉你它是苹果最新推出的编程语言,比c,c++,objc要高效简单.能够开发ios,mac相关的app哦!是苹 ...
- Java学习笔记之---方法和数组
Java学习笔记之---方法与数组 (一)方法 (1)什么是方法? 方法是解决一类问题的步骤的有序组合 方法包含于类或对象中 方法在程序中被创建,在其他地方被引用 (2)方法的优点 使程序变得更简短而 ...
- swift学习笔记5——其它部分(自动引用计数、错误处理、泛型...)
之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...
- swift学习笔记4——扩展、协议
之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...
- swift学习笔记3——类、结构体、枚举
之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...
- swift学习笔记1——基础部分
之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...
随机推荐
- 基于Metronic的Bootstrap开发框架经验总结(6)--对话框及提示框的处理和优化
在各种Web开发过程中,对话框和提示框的处理是很常见的一种界面处理技术,用得好,可以给用户很好的页面体验,Bootstrap开发也一样,我们往往在页面新增.编辑.查看详细等界面使用弹出对话框层的方式进 ...
- Visual Studio 2010 起始页中 不显示最近使用的项目问题,解决办法
最近新装了vs2010,发现打开vs2010 后 起始页面中的最近使用的栏目中 并未显示最近加载的项目 解决办法如下: 运行 regedit 打开下面的键值: HKEY_CURRENT_USER/So ...
- Java线程面试题 Top 50 (转载)
转载自:http://www.cnblogs.com/dolphin0520/p/3958019.html 原文链接:http://www.importnew.com/12773.html 本文由 ...
- 扩展Exception,增加判断Exception是否为SQL引用约束异常方法!
在设计数据表时,如果将某些列设置为关联其它表的外键,那么如果对其进行增加.修改操作时,其关联表若没有相匹配的记录则报错,或者在对其关联表进行删除时,也会报错,这就是外键约束的作用,当然除了外键还有许多 ...
- VMware中网络设置之Bridged
1.设置linux虚拟机Bridged模式. 2.查找网关地址:点击虚拟机工具栏编辑---Virtual Network Editor,选中VMnet0,然后在Bridged to 下拉框中选择可以本 ...
- mysql 二进制日志后缀数字最大为多少
之前看到mysql二进制日志后面会加一个以数字递增为结尾的后缀,一直在想当尾数到达999999后会发生什么情况,先查了一下官网,对后缀有这样一句介绍:The server creates binary ...
- [JS] JS模块化开发之RequireJS
本节将简述RequireJS常用的功能 RequireJS 实现了 Asynchronous Module API. 目录: 为什么使用RequireJS 加载RequireJS Hello Worl ...
- Android SDK Android NDK Android Studio 官方下载地址
2016.12 Android Studio Windows Includes Android SDK https://dl.google.com/dl/android/studio/install/ ...
- GETOBJECTOPTIONS
/// <summary> /// 获取对象的选项 /// </summary> public enum GETOBJECTOPTIONS { /// <summary& ...
- Mailbox unavailable. The server response was: 5.1.1 User unknown
昨晚至今早,在新的项目中,实现一个小功能,就是当有访问者浏览网页在留言簿留言时,系统把留言内容发送至某一个邮箱或是抄送指定的邮箱中. 使用以前能正常发送邮件的代码,但在新项目中,测试时,就是出现标题的 ...