/*
实例方法 是属于特定类实例、结构体实例或者枚举实例的函数。他们为这些实例提供功能性,要么通过提供访问和修改实例属性的方法,要么通过提供与实例目的相关的功能
要写一个实例方法,你需要把它放在对应类的花括号之间。实例方法默认可以访问同类下所有其他实例方法和属性。实例方法只能在类型的具体实例里被调用。它不能在独立于实例而被调用。
*/
class Counter {
var count = 0
func add() {
count += 1
}
func incremt(with num:Int) {
count += num
}
func reset() {
count = 0
}
//每一个类的实例都隐含一个叫做 self的属性,它完完全全与实例本身相等。你可以使用 self属性来在当前实例当中调用它自身的方法
func selfUse(){
self.count = 2
}
}
let counter = Counter()
counter.add()
counter.incremt(with: 2)
print(counter.count)
counter.reset()
//在实例方法中修改值类型 在 func关键字前放一个 mutating关键字来使用这个行为
struct Point {
var x = 0.0,y = 0.0
var z = {
return 3
}
mutating func change(x:Double,y:Double){
self.x += x
self.y += y
}
}
var somePoint = Point()
print("(somePoint.x),(somePoint.y)")
somePoint.change(4, y: 5)
print("(somePoint.x),(somePoint.y)")
//类型方法
//通过在 func关键字之前使用 static关键字来明确一个类型方法。类同样可以使用 class关键字来允许子类重写父类对类型方法的实现。 类方法 用类调用 点语法调用
class SomeClass {
class func someMethord() {
}
}
SomeClass.someMethord()
struct LeverTruck {
static var hightUnlockLevel = 1
var currentLevel = 1
static func unlock (level:Int){
if level > hightUnlockLevel {
hightUnlockLevel = level
}
}
static func isUnLocked (level:Int) -> Bool{
return level <= hightUnlockLevel
}
mutating func advance (to level: Int) -> Bool{
if LeverTruck.isUnLocked(level) {
currentLevel = level
return true
}else{
return false
}
}
}
class Player {
var tract = LeverTruck()
var name:String = ""
func complate(level:Int) {
LeverTruck.isUnLocked(level+1)
tract.advance(to: level + 1)
}
init(name:String){
self.name = name
}
}
var player = Player.init(name: "slc")
player.complate(1)
if player.tract.advance(to: 2){
print("2")
}else{
print("1")
}
print("the level is (LeverTruck.hightUnlockLevel)")
//下标的语法
//下标脚本允许你通过在实例名后面的方括号内写一个或多个值对该类的实例进行查询。它的语法类似于实例方法和和计算属性。使用关键字 subscript 来定义下标,并且指定一个或多个输入形式参数和返回类型,与实例方法一样。与实例方法不同的是,下标可以是读写也可以是只读的。这个行为通过与计算属性中相同的 getter 和 setter 传达:
//subscript (index : Int) -> Int{
// get{
//
// }
//
// set(newValue){
//
// }
//}
struct TimeTable {
let miniNum:Int
subscript (index:Int) -> Int {
return miniNum * index
}
}
//在这个栗子中,创建了一个 TimeTable 的新实例来表示三倍表。它表示通过给结构体的 initializer 转入值 3 来作为用于实例的 multiplier 形式参数 通过下标来查询 threeTimesTable ,比如说调用 threeTimesTable[6] 。这条获取了三倍表的第六条结果,它返回了值 18 或者 6 的 3 倍
var time = TimeTable(miniNum: 3)
print(time[6])
/*
下标可以接收任意数量的输入形式参数,并且这些输入形式参数可以是任意类型。下标也可以返回任意类型。下标可以使用变量形式参数和可变形式参数,但是不能使用输入输出形式参数或提供默认形式参数值。
类或结构体可以根据自身需要提供多个下标实现,合适被使用的下标会基于值类型或者使用下标时下标方括号里包含的值来推断。这个对多下标的定义就是所谓的下标重载。
通常来讲下标接收一个形式参数,但只要你的类型需要也可以为下标定义多个参数。如下例定义了一个 Matrix 结构体,它呈现一个 Double 类型的二维矩阵。 Matrix 结构体的下标接收两个整数形式参数:
*/
struct Matrix {
let rows:Int , clome:Int
var grid: [Double]
init(rows:Int,clome:Int){
self.rows = rows
self.clome = clome
grid = Array(count: rows, repeatedValue: 0.0)
}
func indexIsValidForRow(row:Int,clomn:Int) -> Bool {
return row >= 0 && row < rows && clomn >= 0 && clomn < clome
}
subscript(row:Int,clomn:Int) -> Double{
get{
assert(indexIsValidForRow(row, clomn: clomn),"indexIsvalid")
return grid[(row*clomn) + clomn]
}
set(newValue){
assert(indexIsValidForRow(row, clomn: clomn),"indexIsvalid")
grid[(row * clome) + clomn] = newValue
}
}
}
var maxrit = Matrix.init(rows: 2, clome: 3)
maxrit[1,2] = 1.3