鱼C论坛

 找回密码
 立即注册
查看: 6986|回复: 43

Swift 关于 willset 的 问题

[复制链接]
发表于 2017-3-12 20:45:43 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 漆雕古代 于 2017-3-12 20:48 编辑

最近在看一点swift遇到一个问题,不知道该怎么解决,代码如下

  1. class NamedShape {
  2.     var numberOfSides: Int = 0
  3.     var name: String
  4.    
  5.     init(name: String) {
  6.         self.name = name
  7.     }
  8.    
  9.     func simpleDescription() -> String {
  10.         return "A shape with \(numberOfSides) sides."
  11.     }
  12. }

  13. class Square: NamedShape {
  14.     var sideLength: Double
  15.         
  16.     init(sideLength: Double, name: String) {
  17.         self.sideLength = sideLength
  18.         super.init(name: name)
  19.         numberOfSides = 4
  20.     }
  21.    
  22.     func area() ->  Double {
  23.         return sideLength * sideLength
  24.     }
  25.         
  26.     override func simpleDescription() -> String {
  27.         return "A square with sides of length \(sideLength)."
  28.     }
  29. }


  30. class EquilateralTriangle: NamedShape {
  31.     var sideLength: Double = 0.0
  32.    
  33.     init(sideLength: Double, name: String) {
  34.         self.sideLength = sideLength
  35.         super.init(name: name)
  36.         numberOfSides = 3
  37.     }
  38.    
  39.     var perimeter: Double {
  40.         get {
  41.             return 3.0 * sideLength
  42.         }
  43.         set {
  44.             self.sideLength = newValue / 3.0
  45.         }
  46.     }
  47.    
  48.     override func simpleDescription() -> String {
  49.         return "An equilateral triagle with sides of length \(sideLength)."
  50.     }
  51. }



  52. class TriangleAndSquare {
  53.     var triangle: EquilateralTriangle {
  54.         willSet {
  55.             square.sideLength = newValue.sideLength
  56.         }
  57.     }
  58.             
  59.     //var triangle.sideLength { // 由于用perimeter改变triangle的sideLength属性,导致重新设置的不是triangle而是triangle.sideLength
  60.         //willSet {
  61.             //print(newValue.sideLength)
  62.             //square.sideLength = newValue
  63.         //}
  64.         //didSet {
  65.             //print("triangle a change")
  66.         //}
  67.     //}
  68.    
  69.     var square: Square {
  70.         willSet {
  71.             print(newValue.sideLength)
  72.             triangle.sideLength = newValue.sideLength
  73.         }
  74.     }
  75.         
  76.     init(size: Double, name: String) {
  77.         self.square = Square(sideLength: size, name: name)
  78.         self.triangle = EquilateralTriangle(sideLength: size, name: name)
  79.     }
  80. }


  81. //第一次test
  82. var triangleAndSquare = TriangleAndSquare(size: 10, name: "another test shape")
  83. print(triangleAndSquare.square.sideLength)
  84. print(triangleAndSquare.triangle.sideLength)
  85. //第二次test
  86. triangleAndSquare.square = Square(sideLength: 50, name: "larger square")
  87. print(triangleAndSquare.square.sideLength)
  88. print(triangleAndSquare.triangle.sideLength)
  89. //第三次test测试setter设置的值会不会影响willSet
  90. triangleAndSquare.triangle.perimeter = 60
  91. print(triangleAndSquare.square.sideLength)
  92. print(triangleAndSquare.triangle.sideLength)
复制代码



输出如下

  1. //第一次test输出结果
  2. 10.0
  3. 10.0
  4. //第二次test输出结果
  5. 50.0
  6. 50.0
  7. 50.0
  8. //第三次test输出结果
  9. 50.0
  10. 20.0
复制代码


这段代码出自苹果的官方教程,目的在于让等边三角形和正方形的边长随时保持相等。
本来是一切ok的,但是我想在EquilateralTriangle中有一个perimeter属性拥有getter和setter的功能,可以直接更改sideLength的值,所以在这种情况下willSet不会触发,代码的目是无法达成的吧。

然后一试果然如此,自己尝试解决了一下,但是依旧不行,我自己思考出来的代码无法运行,上网搜索资料页偏少。


我就是想知道有没有可以解决这个问题的办法?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-9-13 23:15:56 | 显示全部楼层

回帖奖励 +2 鱼币

顶楼主,哈哈,祝你早日解决
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-16 11:19:18 | 显示全部楼层
看着好难啊,楼主
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-18 15:44:50 | 显示全部楼层
顶楼主,谢谢分享
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-18 15:45:25 | 显示全部楼层
回复失效了?啊?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-18 21:54:05 | 显示全部楼层

回帖奖励 +2 鱼币

谢谢楼主分享,哈哈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-9-25 21:07:30 | 显示全部楼层
cyndiwants 发表于 2017-9-18 15:45
回复失效了?啊?

我的天啊,半年了居然有人理我了,感动
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-9-25 21:08:02 | 显示全部楼层
longlive 发表于 2017-9-18 21:54
谢谢楼主分享,哈哈

还没解决呢其实哈哈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-1 15:37:27 | 显示全部楼层
感谢楼主
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-1 15:51:28 | 显示全部楼层

回帖奖励 +2 鱼币

还有奖励马
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-26 18:24:29 | 显示全部楼层

回帖奖励 +2 鱼币

祝解决
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-27 22:08:40 | 显示全部楼层

回帖奖励 +2 鱼币

感谢楼主鱼币奖励
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-27 22:14:02 | 显示全部楼层
感谢楼主
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-21 15:16:16 | 显示全部楼层

回帖奖励 +2 鱼币

这么久还没大神来解决
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-3 15:21:57 | 显示全部楼层

顶楼主,谢谢分享
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-19 16:22:11 | 显示全部楼层

回帖奖励 +2 鱼币

蒂{:5_91:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-13 19:03:45 | 显示全部楼层

回帖奖励 +2 鱼币


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-3-22 19:08:20 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-3-24 13:40:49 | 显示全部楼层
新人帮顶一发~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

头像被屏蔽
发表于 2018-11-30 10:41:14 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-21 00:04

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表