方法
1.实例方法 (Instance Methods)
实例方法是属于某个特定类、结构体或者枚举类型实例的方法,提供访问和修改实例属性的方法或提供与实例目的相关的功能,语法与函数一致 实例方法写在类里面,能够访问所属类型的其他方法和属性,只能被它所属类的特定实例调用
-
- classCounter{
- varcount=0
- funcincrement(){
- count++
- }
- funcincrementBy(amount:Int){
- count+=amount
- }
- funcreset(){
- count=0
- letcounter=Counter()
- //theinitialcountervalueis0
- counter.increment()
- //thecounter'svalueisnow1
- counter.incrementBy(5)
- //thecounter'svalueisnow6
- counter.reset()
- //thecounter'svalueisnow0
2.方法的局部参数名和外部参数名
函数可同时有局部名称(内部使用)和外部名称(调用函数时使用),方法的参数也类似,不过方法和函数的局部名称和外部名称的默认行为是不一样的 Swift中默认给第一个参数名称一个局部参数名称,第二和后续的参数局部参数名称和外部参数名称
classCounter{
- varcount:Int=0
- funcincrementBy(amount:Int,numberOfTimes:Int){
- count+=amount*numberOfTimes
- //incrementBy有两个参数,默认把amount当做一个局部名称,但把numberOfTimes既看做局部名称又看做外部名称
- counter.incrementBy(5,numberOfTimes:3)
-
-
- //这种默认的方式能有效的处理方法,类似在参数前加#号
- }
修改方法的外部参数名称
有时为方法的第一个参数提供外部参数名也是有用的,可以显示在参数前添加#号
如果不想为方法的第二个及后续参数提供外部参数名称,在前面使用下划线 (_) 作为该参数的显式外部名称
3.self属性
类型的每个实例都有一个隐藏的属性self,等同于实例本身,但其实只要在一个方法中使用一个已知的属性或方法,即使没有明确的写出self,Swift也会假定是当前的,但是如果实例方法的某个参数名称与实例的某个属性名称相同时,这种情况下参数名称享有优先权,这时需要self来区分参数名称和属性名称
funcincrement(){
- self.count++
- //以下例子使用self消除参数x和实例属性x之间的歧义
- structPoint{
- varx=0.0,y=0.0
- funcisToTheRightOfX(x:Double)->Bool{
- returnself.x>x
- letsomePoint=Point(x:4.0,0); background-color:inherit">y:5.0)
- ifsomePoint.isToTheRightOfX(1.0){
- println("Thispointistotherightofthelinewherex==1.0")
- //prints"Thispointistotherightofthelinewherex==1.0"
4.在实例方法中修改值类型
结构体和枚举是值类型,一般不允许在实例方法中修改值类型的属性,但是可以使用 (mutating) 这个方法,然后方法从内部改变它的属性,并且所做的改变在方法结束时都还保留在原始结构中
mutatingfuncmoveByX(deltaX:Double,ydeltaY:Double){
- x+=deltaX
- y+=deltaY
- varsomePoint=Point(x:1.0,0); background-color:inherit">y:1.0)
- somePoint.moveByX(2.0,0); background-color:inherit">y:3.0)
- println("Thepointisnowat((somePoint.x),(somePoint.y))")
- //prints"Thepointisnowat(3.0,4.0)"
- //不能在结构体类型常量中调用mutating方法,因为常量属性不可改变,即使是常量的变量属性也不行
- letfixedPoint=Point(x:3.0,248)"> fixedPoint.moveByX(2.0,0); background-color:inherit">y:3.0)
- //thiswillreportanerror
-
- //在mutating方法中给self赋值
- //mutating方法给self赋了一个新的实例,并在方法结束后替换原有的实例,以下例子和上一例子其实是一样的
- self=Point(x:x+deltaX,0); background-color:inherit">y:y+deltaY)
- //枚举的mutating方法把self设置为相同的枚举类型中不同的成员
- enumTriStateSwitch{
- caseOff,Low,High
- mutatingfuncnext(){
- switchself{
- caseOff:
- self=Low
- Low:
- self=High
- High:
- self=Off
- varovenLight=TriStateSwitch.Low
- ovenLight.next()
- //ovenLightisnowequalto.High
- //ovenLightisnowequalto.Off
5.类型方法
实例方法是被实例调用的方法,类型调用本身的方法成为类型方法,声明类的类型方法:class func methName,声明结构体和枚举的类型方法:static func methName
classSomeClass{
- classfuncsomeTypeMethod(){
- //typemethodimplementationgoeshere
- SomeClass.someTypeMethod()
以下是另外一个例子
structLevelTracker{
- staticvarhighestUnlockedLevel=1
- staticfuncunlockLevel(level:Int){
- iflevel>highestUnlockedLevel{highestUnlockedLevel=level}
- staticfunclevelIsUnlocked(level:Int)->Bool{
- returnlevel<=highestUnlockedLevel
- varcurrentLevel=1
- mutatingfuncadvanceToLevel(level:Int)->Bool{
- ifLevelTracker.levelIsUnlocked(level){
- currentLevel=level
- true
- }else{
- false
- classPlayer{
- vartracker=LevelTracker()
- letplayerName:String
- funccompletedLevel(level:Int){
- LevelTracker.unlockLevel(level+1)
- tracker.advanceToLevel(level+1)
- init(name:String){
- playerName=name
- varplayer=Player(name:"Argyrios")
- player.completedLevel(1)
- println("highestunlockedlevelisnow(LevelTracker.highestUnlockedLevel)")
- //prints"highestunlockedlevelisnow2"
- player=Player(name:"Beto")
- ifplayer.tracker.advanceToLevel(6){
- println("playerisnowonlevel6")
- println("level6hasnotyetbeenunlocked")
- //prints"level6hasnotyetbeenunlocked"
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|