swift基础笔记6-方法&下标脚本
摘要:类、结构体、枚举都可以定义实例方法;实例方法为给定类型的实例封装 了具体的任务与功能。类、结构体、枚举也可以定义类型方法;类型方法与类型本身相关联。类型方法与 Objecti ve-C 中的类方法(class methods)相似。 实例方法实例方法是属于某个特定类、结构体或者枚举类型实例的方法。具体说明略 方法的局部参数名称和外部参数名称Swift 中方法的名称通常用一个 介词指向方法的第一个参数,比如: ? with,for?,by ? 等等。也就是说能通过方法名直接明白第一个参数的含义,所以Swift 默认仅给方法的第一个参数名称一个局部参数名称;默认同时给第二个和后续的参数名称局部参 数名称和外部参数名称。 修改方法的外部参数名称有时为方法的第一个参数提供一个外部参数名称是非常有用的,尽管这不是默认的行为。你可以自己添加一个显 式的外部名称或者用一个井号( # )作为第一个参数的前缀来把这个局部名称当作外部名称使用。 在实例方法中修改值类型结构体和枚举是值类型。一般情况下,值类型的属性不能在它的实例方法中被修改。 struct Point {
var x = 0.0,y = 0.0
mutating func moveByX(deltaX: Double,y deltaY: Double) {
x += deltaX
y += deltaY }
}
var somePoint = Point(x: 1.0,y: 1.0) somePoint.moveByX(2.0,y: 3.0)
print("The point is now at ((somePoint.x),(somePoint.y))") // 打印输出: "The point is now at (3.0,4.0)"
上面的 Point 结构体定义了一个变异方法(mutating method) moveByX(_:y:) 用来移动点。 moveByX 方法 在被调用时修改了这个点,而不是返回一个新的点。方法定义时加上 mutating 关键字,这才让方法可以修改值 类型的属性。 在变异方法中给self赋值变异方法能够赋给隐含属性 self 一个全新的实例。上面 Point 的例子可以用下面的方式改写: struct Point {
var x = 0.0,y deltaY: Double) {
self = Point(x: x + deltaX,y: y + deltaY) }
}
类型方法(类方法)定义类型本身调用的方法,这种方法就叫做类型方法。声明 结构体和枚举的类型方法,在方法的 func 关键字之前加上关键字 static 。类可能会用关键字 Class 来允许子类 重写父类的实现方法。 class SomeClass {
class func someTypeMethod() {
// type method implementation goes here }
} SomeClass.someTypeMethod()
下面是一个很有趣的例子,它定义了一个名为 LevelTracker 结构体。它监测玩家的游戏发展情况(游戏的不同层次或阶段)。这 是一个单人游戏,但也可以存储多个玩家在同一设备上的游戏信息。 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
} }
}
尽管我们没有使用类似 LevelTracker.highestUnlockedLeve l 的写法,这个类型方法还是能够访问静态属性 highestUnlockedLevel ) 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 } }
下标脚本下标脚本 可以定义在类(Class)、结构体(structure)和枚举(enumeration)这些目标中,可以认为是访问 集合(collection),列表(list)或序列(sequence的快捷方式,使用下标脚本的索引设置和获取值,不需要 再调用实例的特定的赋值和访问方法。 subscript(index: Int) -> Int {
get {
// 返回与入参匹配的Int类型的值 }
set(newValue) {
// 执行赋值操作
}
}
与只读计算型属性一样,可以直接将原本应该写在 get 代码块中的代码写在 subscript 中: subscript(index: Int) -> Int {
// 返回与入参匹配的Int类型的值
}
下面代码演示了一个在 TimesTable 结构体中使用只读下标脚本的用法,该结构体用来展示传入整数的n倍。 struct TimesTable {
let multiplier: Int subscript(index: Int) -> Int {
return multiplier * index }
}
let threeTimesTable = TimesTable(multiplier: 3)
print("3的6倍是(threeTimesTable[6])")
// 输出 "3的6倍是18"
var numberOfLegs = ["spider": 8,"ant": 6,"cat": 4]
numberOfLegs["bird"] = 2
//在字典中添加了一个key为bird,值为2的数据
初学笔记,不喜勿喷,欢迎指点! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 【cocos2d-x 3.7 飞机大战】 决战南海I (十) 游戏主场景
- ruby-on-rails – 在ROR中记录用户活动
- Ruby对象变量以及为什么它们总是等同名?
- React 可视化开发工具 Shadow Widget 非正经入门(之六:ma
- reactjs – Reagent生成一个传递React.isValidClass(组件)的
- 正则表达式 – 用于解析LDAP dn的正则表达式
- ruby-on-rails – 用于rails 4补丁的Rspec案例:更新
- Ruby动态对象属性,发送vs实例变量集
- ruby-on-rails – 获取所有条目,在Rails中使用空列
- SQLite学习手册(内存数据库)