Swift 方法(十)

前端之家收集整理的这篇文章主要介绍了Swift 方法(十)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
方法

1.实例方法 (Instance Methods)

实例方法是属于某个特定类、结构体或者枚举类型实例的方法,提供访问和修改实例属性方法或提供与实例目的相关的功能,语法与函数一致
实例方法写在类里面,能够访问所属类型的其他方法属性,只能被它所属类的特定实例调用
@H_403_17@[objc] view plain copy
  1. //Count类定义了3个实例方法,通过点操作符调用
  2. classCounter{
  3. varcount=0
  4. funcincrement(){
  5. count++
  6. }
  7. funcincrementBy(amount:Int){
  8. count+=amount
  9. }
  10. funcreset(){
  11. count=0
  12. letcounter=Counter()
  13. //theinitialcountervalueis0
  14. counter.increment()
  15. //thecounter'svalueisnow1
  16. counter.incrementBy(5)
  17. //thecounter'svalueisnow6
  18. counter.reset()
  19. //thecounter'svalueisnow0

2.方法的局部参数名和外部参数名

函数可同时有局部名称(内部使用)和外部名称(调用函数时使用),方法的参数也类似,不过方法和函数的局部名称和外部名称的默认行为是不一样的
Swift中默认给第一个参数名称一个局部参数名称,第二和后续的参数局部参数名称和外部参数名称
    classCounter{
  1. varcount:Int=0
  2. funcincrementBy(amount:Int,numberOfTimes:Int){
  3. count+=amount*numberOfTimes
  4. //incrementBy有两个参数,默认把amount当做一个局部名称,但把numberOfTimes既看做局部名称又看做外部名称
  5. counter.incrementBy(5,numberOfTimes:3)
  6. //countervalueisnow15
  7. //这种默认的方式能有效的处理方法,类似在参数前加#号
  8. }

修改方法的外部参数名称
有时为方法的第一个参数提供外部参数名也是有用的,可以显示在参数前添加#号
如果不想为方法的第二个及后续参数提供外部参数名称,在前面使用下划线 (_) 作为该参数的显式外部名称

3.self属性

类型的每个实例都有一个隐藏的属性self,等同于实例本身,但其实只要在一个方法中使用一个已知的属性或方法,即使没有明确的写出self,Swift也会假定是当前的,但是如果实例方法的某个参数名称与实例的某个属性名称相同时,这种情况下参数名称享有优先权,这时需要self来区分参数名称和属性名称
    funcincrement(){
  1. self.count++
  2. //以下例子使用self消除参数x和实例属性x之间的歧义
  3. structPoint{
  4. varx=0.0,y=0.0
  5. funcisToTheRightOfX(x:Double)->Bool{
  6. returnself.x>x
  7. letsomePoint=Point(x:4.0,0); background-color:inherit">y:5.0)
  8. ifsomePoint.isToTheRightOfX(1.0){
  9. println("Thispointistotherightofthelinewherex==1.0")
  10. //prints"Thispointistotherightofthelinewherex==1.0"

4.在实例方法中修改值类型

结构体和枚举是值类型,一般不允许在实例方法中修改值类型的属性,但是可以使用 (mutating) 这个方法,然后方法从内部改变它的属性,并且所做的改变在方法结束时都还保留在原始结构中
    mutatingfuncmoveByX(deltaX:Double,ydeltaY:Double){
  1. x+=deltaX
  2. y+=deltaY
  3. varsomePoint=Point(x:1.0,0); background-color:inherit">y:1.0)
  4. somePoint.moveByX(2.0,0); background-color:inherit">y:3.0)
  5. println("Thepointisnowat(\(somePoint.x),\(somePoint.y))")
  6. //prints"Thepointisnowat(3.0,4.0)"
  7. //不能在结构体类型常量中调用mutating方法,因为常量属性不可改变,即使是常量的变量属性也不行
  8. letfixedPoint=Point(x:3.0,248)"> fixedPoint.moveByX(2.0,0); background-color:inherit">y:3.0)
  9. //thiswillreportanerror
  10. //在mutating方法中给self赋值
  11. //mutating方法给self赋了一个新的实例,并在方法结束后替换原有的实例,以下例子和上一例子其实是一样的
  12. self=Point(x:x+deltaX,0); background-color:inherit">y:y+deltaY)
  13. //枚举的mutating方法把self设置为相同的枚举类型中不同的成员
  14. enumTriStateSwitch{
  15. caseOff,Low,High
  16. mutatingfuncnext(){
  17. switchself{
  18. caseOff:
  19. self=Low
  20. Low:
  21. self=High
  22. High:
  23. self=Off
  24. varovenLight=TriStateSwitch.Low
  25. ovenLight.next()
  26. //ovenLightisnowequalto.High
  27. //ovenLightisnowequalto.Off

5.类型方法

实例方法是被实例调用的方法,类型调用本身的方法成为类型方法,声明类的类型方法:class func methName,声明结构体和枚举的类型方法:static func methName
    classSomeClass{
  1. classfuncsomeTypeMethod(){
  2. //typemethodimplementationgoeshere
  3. SomeClass.someTypeMethod()

以下是另外一个例子
    structLevelTracker{
  1. staticvarhighestUnlockedLevel=1
  2. staticfuncunlockLevel(level:Int){
  3. iflevel>highestUnlockedLevel{highestUnlockedLevel=level}
  4. staticfunclevelIsUnlocked(level:Int)->Bool{
  5. returnlevel<=highestUnlockedLevel
  6. varcurrentLevel=1
  7. mutatingfuncadvanceToLevel(level:Int)->Bool{
  8. ifLevelTracker.levelIsUnlocked(level){
  9. currentLevel=level
  10. true
  11. }else{
  12. false
  13. classPlayer{
  14. vartracker=LevelTracker()
  15. letplayerName:String
  16. funccompletedLevel(level:Int){
  17. LevelTracker.unlockLevel(level+1)
  18. tracker.advanceToLevel(level+1)
  19. init(name:String){
  20. playerName=name
  21. varplayer=Player(name:"Argyrios")
  22. player.completedLevel(1)
  23. println("highestunlockedlevelisnow\(LevelTracker.highestUnlockedLevel)")
  24. //prints"highestunlockedlevelisnow2"
  25. player=Player(name:"Beto")
  26. ifplayer.tracker.advanceToLevel(6){
  27. println("playerisnowonlevel6")
  28. println("level6hasnotyetbeenunlocked")
  29. //prints"level6hasnotyetbeenunlocked"
原文链接:https://www.f2er.com/swift/325171.html

猜你在找的Swift相关文章