@H_502_2@
import@H_502_2@ Foundation@H_502_2@
@H_502_2@
//@H_502_2@方法是与某些特定类型相关联的函数。类、结构体、枚举都可以定义实例方法@H_502_2@;@H_502_2@实例方法为给定类型的实例封装@H_502_2@ @H_502_2@了具体的任务与功能。类、结构体、枚举也可以定义类型方法@H_502_2@;@H_502_2@类型方法与类型本身相关联。类型方法与@H_502_2@ Objecti ve-C @H_502_2@中的类方法@H_502_2@(class methods)@H_502_2@相似。@H_502_2@
@H_502_2@
/*@H_502_2@实例方法@H_502_2@************************************************************/@H_502_2@
//@H_502_2@实例方法是属于某个特定类、结构体或者枚举类型实例的方法。实例方法提供访问和修改实例属性的方法或提供与实例目的相关的功能@H_502_2@,@H_502_2@并以此来支撑实例的功能。@H_502_2@
@H_502_2@
//@H_502_2@实例方法要写在它所属的类型的前后大括号之间。实例方法能够隐式访问它所属类型的所有的其他实例方法和属性。实例方法只能被它所属的类的某个特定实例调用。实例方法不能脱离于现存的实例而被调用。@H_502_2@
class@H_502_2@ Counter {@H_502_2@
@H_502_2@var@H_502_2@ count = @H_502_2@0@H_502_2@
@H_502_2@func@H_502_2@ increment() {@H_502_2@
++@H_502_2@count@H_502_2@
}@H_502_2@
@H_502_2@func@H_502_2@ incrementBy(amount: @H_502_2@Int@H_502_2@){@H_502_2@
@H_502_2@count@H_502_2@ += amount@H_502_2@
}@H_502_2@
@H_502_2@func@H_502_2@ reset() {@H_502_2@
@H_502_2@count@H_502_2@ = @H_502_2@0@H_502_2@
}@H_502_2@
}@H_502_2@
@H_502_2@
let@H_502_2@ counter = @H_502_2@Counter@H_502_2@()@H_502_2@
print@H_502_2@(@H_502_2@"@H_502_2@\@H_502_2@(@H_502_2@counter@H_502_2@.@H_502_2@count@H_502_2@)"@H_502_2@)@H_502_2@
// @H_502_2@初始计数值是@H_502_2@0@H_502_2@
counter@H_502_2@.@H_502_2@increment@H_502_2@()@H_502_2@
print@H_502_2@(@H_502_2@"@H_502_2@\@H_502_2@(@H_502_2@counter@H_502_2@.@H_502_2@count@H_502_2@)"@H_502_2@)@H_502_2@
// @H_502_2@计数值现在是@H_502_2@1@H_502_2@
counter@H_502_2@.@H_502_2@incrementBy@H_502_2@(@H_502_2@5@H_502_2@)@H_502_2@
print@H_502_2@(@H_502_2@"@H_502_2@\@H_502_2@(@H_502_2@counter@H_502_2@.@H_502_2@count@H_502_2@)"@H_502_2@)@H_502_2@
// @H_502_2@计数值现在是@H_502_2@6@H_502_2@
counter@H_502_2@.@H_502_2@reset@H_502_2@()@H_502_2@
print@H_502_2@(@H_502_2@"@H_502_2@\@H_502_2@(@H_502_2@counter@H_502_2@.@H_502_2@count@H_502_2@)"@H_502_2@)@H_502_2@
// @H_502_2@计数值现在是@H_502_2@0@H_502_2@
@H_502_2@
class@H_502_2@ Counter2 {@H_502_2@
@H_502_2@var@H_502_2@ count: @H_502_2@Int@H_502_2@ = @H_502_2@0@H_502_2@
@H_502_2@func@H_502_2@ incrementBy(amount: @H_502_2@Int@H_502_2@,numberOfTimes: @H_502_2@Int@H_502_2@) {@H_502_2@
@H_502_2@count@H_502_2@ += amount * numberOfTimes@H_502_2@
}@H_502_2@
}@H_502_2@
@H_502_2@
let@H_502_2@ counter2 = @H_502_2@Counter2@H_502_2@()@H_502_2@
counter2@H_502_2@.@H_502_2@incrementBy@H_502_2@(@H_502_2@5@H_502_2@,numberOfTimes: @H_502_2@3@H_502_2@);@H_502_2@
print@H_502_2@(@H_502_2@"@H_502_2@\@H_502_2@(@H_502_2@counter2@H_502_2@.@H_502_2@count@H_502_2@)"@H_502_2@)@H_502_2@
@H_502_2@
//@H_502_2@下面的例子中@H_502_2@,self @H_502_2@消除方法参数@H_502_2@ x @H_502_2@和实例属性@H_502_2@ x @H_502_2@之间的歧义@H_502_2@:@H_502_2@
struct@H_502_2@ Point {@H_502_2@
@H_502_2@var@H_502_2@ x = @H_502_2@0.0@H_502_2@,y = @H_502_2@0.0@H_502_2@
@H_502_2@func@H_502_2@ isToTheRightOfX(x: @H_502_2@Double@H_502_2@) -> @H_502_2@Bool@H_502_2@ {@H_502_2@
@H_502_2@return@H_502_2@ @H_502_2@self@H_502_2@.@H_502_2@x@H_502_2@ > x@H_502_2@
}@H_502_2@
}@H_502_2@
let@H_502_2@ somePoint = @H_502_2@Point@H_502_2@(x: @H_502_2@4.0@H_502_2@,y: @H_502_2@5.0@H_502_2@)@H_502_2@
if@H_502_2@ @H_502_2@somePoint@H_502_2@.@H_502_2@isToTheRightOfX@H_502_2@(@H_502_2@1.0@H_502_2@) {@H_502_2@
@H_502_2@print@H_502_2@(@H_502_2@"This point is to the right of the line where x == 1.0"@H_502_2@)@H_502_2@
}@H_502_2@
// @H_502_2@打印输出@H_502_2@: This point is to the right of the line where x == 1.0@H_502_2@
@H_502_2@
//@H_502_2@如果你确实需要在某个具体的方法中修改结构体或者枚举的属性@H_502_2@,@H_502_2@你可以选择@H_502_2@ @H_502_2@变异@H_502_2@(mutating) @H_502_2@这个方@H_502_2@ @H_502_2@法@H_502_2@,@H_502_2@然后方法就可以从方法内部改变它的属性@H_502_2@;@H_502_2@并且它做的任何改变在方法结束时还会保留在原始结构中。方法@H_502_2@ @H_502_2@还可以给它隐含的@H_502_2@ self @H_502_2@属性赋值一个全新的实例@H_502_2@,@H_502_2@这个新实例在方法结束后将替换原来的实例。@H_502_2@
struct@H_502_2@ Point2 {@H_502_2@
@H_502_2@var@H_502_2@ x = @H_502_2@0.0@H_502_2@,y = @H_502_2@0.0@H_502_2@
@H_502_2@mutating@H_502_2@ @H_502_2@func@H_502_2@ moveByX(deltaX: @H_502_2@Double@H_502_2@,y deltaY: @H_502_2@Double@H_502_2@) {@H_502_2@
@H_502_2@x@H_502_2@ += deltaX@H_502_2@
@H_502_2@y@H_502_2@ += deltaY@H_502_2@
}@H_502_2@
}@H_502_2@
var@H_502_2@ somePoint2 = @H_502_2@Point2@H_502_2@(x: @H_502_2@1.0@H_502_2@,y: @H_502_2@1.0@H_502_2@)@H_502_2@
somePoint2@H_502_2@.@H_502_2@moveByX@H_502_2@(@H_502_2@2.0@H_502_2@,y: @H_502_2@3.0@H_502_2@)@H_502_2@
print@H_502_2@(@H_502_2@"The point is Now at (@H_502_2@\@H_502_2@(@H_502_2@somePoint2@H_502_2@.@H_502_2@x@H_502_2@),@H_502_2@\@H_502_2@(@H_502_2@somePoint2@H_502_2@.@H_502_2@y@H_502_2@))"@H_502_2@)@H_502_2@
// @H_502_2@打印输出@H_502_2@: "The point is Now at (3.0,4.0)"@H_502_2@
@H_502_2@
//@H_502_2@变异方法能够赋给隐含属性@H_502_2@ self @H_502_2@一个全新的实例。上面@H_502_2@ Point @H_502_2@的例子可以用下面的方式改写@H_502_2@:@H_502_2@
struct@H_502_2@ Point3 {@H_502_2@
@H_502_2@var@H_502_2@ x = @H_502_2@0.0@H_502_2@,y deltaY: @H_502_2@Double@H_502_2@) {@H_502_2@
@H_502_2@self@H_502_2@ = @H_502_2@Point3@H_502_2@(x: @H_502_2@x@H_502_2@ + deltaX,y: @H_502_2@y@H_502_2@ + deltaY)@H_502_2@
}@H_502_2@
}@H_502_2@
@H_502_2@
//@H_502_2@枚举的变异方法可以把@H_502_2@ self @H_502_2@设置为相同的枚举类型中不同的成员@H_502_2@:@H_502_2@
enum@H_502_2@ TriStateSwitch {@H_502_2@
@H_502_2@case@H_502_2@ Off,Low,High@H_502_2@
@H_502_2@mutating@H_502_2@ @H_502_2@func@H_502_2@ next() {@H_502_2@
@H_502_2@switch@H_502_2@ @H_502_2@self@H_502_2@ {@H_502_2@
@H_502_2@case@H_502_2@ Off:@H_502_2@
@H_502_2@self@H_502_2@ = @H_502_2@Low@H_502_2@
@H_502_2@case@H_502_2@ Low:@H_502_2@
@H_502_2@self@H_502_2@ = @H_502_2@High@H_502_2@
@H_502_2@case@H_502_2@ High:@H_502_2@
@H_502_2@self@H_502_2@ = @H_502_2@Off@H_502_2@
}@H_502_2@
}@H_502_2@
}@H_502_2@
var@H_502_2@ ovenlight = @H_502_2@TriStateSwitch@H_502_2@.@H_502_2@Low@H_502_2@
ovenlight@H_502_2@.@H_502_2@next@H_502_2@()@H_502_2@
// ovenlight @H_502_2@现在等于@H_502_2@ .High@H_502_2@
ovenlight@H_502_2@.@H_502_2@next@H_502_2@()@H_502_2@
// ovenlight @H_502_2@现在等于@H_502_2@ .Off@H_502_2@
@H_502_2@
@H_502_2@
@H_502_2@
/*@H_502_2@类型方法@H_502_2@************************************************************/@H_502_2@
@H_502_2@
//@H_502_2@实例方法是被类型的某个实例调用的方法。你也可以定义类型本身调用的方法@H_502_2@,@H_502_2@这种方法就叫做类型方法。声明@H_502_2@ @H_502_2@结构体和枚举的类型方法@H_502_2@,@H_502_2@在方法的@H_502_2@ func @H_502_2@关键字之前加上关键字@H_502_2@ static @H_502_2@。类可能会用关键字@H_502_2@ class @H_502_2@来允许子类@H_502_2@ @H_502_2@重写父类的实现方法。@H_502_2@
//@H_502_2@类型方法和实例方法一样用点语法调用。但是@H_502_2@,@H_502_2@你是在类型层面上调用这个方法@H_502_2@,@H_502_2@而不是在实例层面上调用。下@H_502_2@ @H_502_2@面是如何在@H_502_2@ SomeClass @H_502_2@类上调用类型方法的例子@H_502_2@:@H_502_2@
class@H_502_2@ SomeClass {@H_502_2@
@H_502_2@class@H_502_2@ @H_502_2@func@H_502_2@ someTypeMethod() {@H_502_2@
@H_502_2@// type method implementation goes here@H_502_2@
@H_502_2@print@H_502_2@(@H_502_2@"someTypeMethod()"@H_502_2@)@H_502_2@
}@H_502_2@
}@H_502_2@
SomeClass@H_502_2@.@H_502_2@someTypeMethod@H_502_2@()@H_502_2@
//@H_502_2@在类型方法的方法体@H_502_2@(body)@H_502_2@中@H_502_2@,self @H_502_2@指向这个类型本身@H_502_2@,@H_502_2@而不是类型的某个实例。对于结构体和枚举来说@H_502_2@,@H_502_2@这意味着你可以用@H_502_2@ self @H_502_2@来消除静态属性和静态方法参数之间的歧义@H_502_2@
struct@H_502_2@ LevelTracker {@H_502_2@
@H_502_2@static@H_502_2@ @H_502_2@var@H_502_2@ highestUnlockedLevel = @H_502_2@ 1@H_502_2@
@H_502_2@static@H_502_2@ @H_502_2@func@H_502_2@ unlockLevel(level: @H_502_2@Int@H_502_2@) {@H_502_2@
@H_502_2@if@H_502_2@ level > highestUnlockedLevel { highestUnlockedLevel = level }@H_502_2@
}@H_502_2@
@H_502_2@static@H_502_2@ @H_502_2@func@H_502_2@ levelisUnlocked(level: @H_502_2@ Int@H_502_2@) -> @H_502_2@Bool@H_502_2@ {@H_502_2@
@H_502_2@return@H_502_2@ level <= highestUnlockedLevel@H_502_2@
}@H_502_2@
@H_502_2@var@H_502_2@ currentLevel = @H_502_2@1@H_502_2@
@H_502_2@mutating@H_502_2@ @H_502_2@func@H_502_2@ advancetoLevel(level: @H_502_2@ Int@H_502_2@) -> @H_502_2@Bool@H_502_2@ {@H_502_2@
@H_502_2@if@H_502_2@ @H_502_2@LevelTracker@H_502_2@.@H_502_2@levelisUnlocked@H_502_2@(level) {@H_502_2@
@H_502_2@currentLevel@H_502_2@ = level@H_502_2@
@H_502_2@return@H_502_2@ @H_502_2@true@H_502_2@
} @H_502_2@else@H_502_2@ {@H_502_2@
@H_502_2@return@H_502_2@ @H_502_2@false@H_502_2@
}@H_502_2@
}@H_502_2@
}@H_502_2@
@H_502_2@
//LevelTracker @H_502_2@监测玩家的已解锁的最高等级。这个值被存储在静态属性@H_502_2@ highestUnlockedLevel @H_502_2@中。@H_502_2@
//LevelTracker @H_502_2@还定义了两个类型方法与@H_502_2@ highestUnlockedLevel @H_502_2@配合工作。第一个类型方法是@H_502_2@ unlockLevel :@H_502_2@一旦新等级被解锁@H_502_2@,@H_502_2@它会更新@H_502_2@ highestUnlockedLevel @H_502_2@的值。第二个类型方法是@H_502_2@ levelisUnlocked :@H_502_2@如果某个@H_502_2@ @H_502_2@给定的等级已经被解锁@H_502_2@,@H_502_2@它将返回@H_502_2@ true @H_502_2@。@H_502_2@(@H_502_2@注意@H_502_2@:@H_502_2@尽管我们没有使用类似@H_502_2@ LevelTracker.highestUnlockedLeve l @H_502_2@的写法@H_502_2@,@H_502_2@这个类型方法还是能够访问静态属性@H_502_2@ highestUnlockedLevel )@H_502_2@
//@H_502_2@为了便于管理@H_502_2@ currentLevel @H_502_2@属性@H_502_2@,LevelTracker @H_502_2@定义了实例方法@H_502_2@ advancetoLevel @H_502_2@。这个方法会在更新@H_502_2@ curre ntLevel @H_502_2@之前检查所请求的新等级是否已经解锁。@H_502_2@ advancetoLevel @H_502_2@方法返回布尔值以指示是否能够设置@H_502_2@ curren tLevel @H_502_2@ 。@H_502_2@
//@H_502_2@下面@H_502_2@,Player @H_502_2@类使用@H_502_2@ LevelTracker @H_502_2@来监测和更新每个玩家的发展进度@H_502_2@:@H_502_2@
class@H_502_2@ Player {@H_502_2@
@H_502_2@var@H_502_2@ tracker = @H_502_2@LevelTracker@H_502_2@()@H_502_2@
@H_502_2@let@H_502_2@ playername: @H_502_2@String@H_502_2@
@H_502_2@func@H_502_2@ completedLevel(level: @H_502_2@Int@H_502_2@) {@H_502_2@
@H_502_2@LevelTracker@H_502_2@.@H_502_2@unlockLevel@H_502_2@(level + @H_502_2@1@H_502_2@)@H_502_2@
@H_502_2@tracker@H_502_2@.@H_502_2@advancetoLevel@H_502_2@(level + @H_502_2@1@H_502_2@)@H_502_2@
}@H_502_2@
@H_502_2@init@H_502_2@(name: @H_502_2@String@H_502_2@) {@H_502_2@
@H_502_2@playername@H_502_2@ = name@H_502_2@
}@H_502_2@
}@H_502_2@
//Player @H_502_2@类创建一个新的@H_502_2@ LevelTracker @H_502_2@实例来监测这个用户的进度。它提供了@H_502_2@ completedLevel @H_502_2@ 方法@H_502_2@:@H_502_2@一旦玩家@H_502_2@ @H_502_2@完成某个指定等级就调用它。这个方法为所有玩家解锁下一等级@H_502_2@,@H_502_2@并且将当前玩家的进度更新为下一等级。@H_502_2@(@H_502_2@我们忽略了@H_502_2@ advancetoLevel @H_502_2@返回的布尔值@H_502_2@,@H_502_2@因为之前调用@H_502_2@ LevelTracker.unlockLevel @H_502_2@时就知道了这个等级已经被解锁了@H_502_2@)@H_502_2@。@H_502_2@
@H_502_2@
//@H_502_2@你还可以为一个新的玩家创建一个@H_502_2@ Player @H_502_2@的实例@H_502_2@,@H_502_2@然后看这个玩家完成等级一时发生了什么@H_502_2@:@H_502_2@
var@H_502_2@ player = @H_502_2@Player@H_502_2@(name: @H_502_2@"Argyrios"@H_502_2@)@H_502_2@
player@H_502_2@.@H_502_2@completedLevel@H_502_2@(@H_502_2@1@H_502_2@)@H_502_2@
print@H_502_2@(@H_502_2@"highest unlocked level is Now @H_502_2@\@H_502_2@(@H_502_2@LevelTracker@H_502_2@.highestUnlockedLevel@H_502_2@)"@H_502_2@)@H_502_2@
// @H_502_2@打印输出@H_502_2@:highest unlocked level is Now 2@H_502_2@
@H_502_2@
//@H_502_2@如果你创建了第二个玩家@H_502_2@,@H_502_2@并尝试让他开始一个没有被任何玩家解锁的等级@H_502_2@,@H_502_2@那么这次设置玩家当前等级的尝试将会失败@H_502_2@:@H_502_2@
player@H_502_2@ = @H_502_2@Player@H_502_2@(name: @H_502_2@"Beto"@H_502_2@)@H_502_2@
if@H_502_2@ @H_502_2@player@H_502_2@.@H_502_2@tracker@H_502_2@.@H_502_2@advancetoLevel@H_502_2@(@H_502_2@6@H_502_2@) {@H_502_2@
@H_502_2@print@H_502_2@(@H_502_2@"player is Now on level 6"@H_502_2@)@H_502_2@
} @H_502_2@else@H_502_2@ {@H_502_2@
@H_502_2@print@H_502_2@(@H_502_2@"level 6 has not yet been unlocked"@H_502_2@)@H_502_2@
}@H_502_2@
// @H_502_2@打印输出@H_502_2@:level 6 has not yet been unlocked@H_502_2@
总结以上是内存溢出为你收集整理的《swift2.0 官方教程中文版》 第2章-11方法全部内容,希望文章能够帮你解决《swift2.0 官方教程中文版》 第2章-11方法所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)