违背类的封装,直接操作数据。感觉是一道挺经典的iOS面试题,没找到答案。会发生什么错误呢?



     class Information: NSObject {
            var phoneNum: String?
            var age: Int?
            init(phone: String, age: Int) {
                self.phoneNum = phone
                self.age = age
            }
        }
    
    class Person: NSObject {
            var info: Information
            var name: String
            init(name: String, info: Information) {
                self.name = name
                self.info = info
            }
        }
var info = Information(phone: "123", age: 5)
var person = Person(name: "deng", info: info)
person.info.phoneNum = "123"

person.info.phoneNum = "123"

这句代码,会引发什么错误?
编译过了,项目跑起来,没事。
我觉得,他直接操纵Information类的属性,违背了类的封装,应该是不能直接访问数据,应该要通过类暴露在外面的方法设置。
面试上遇到的,感觉应该有更加深刻的原因。 以前OC版的好像看到过,未仔细分析。

阅读 4.5k
4 个回答

"违背了类的封装,应该是不能直接访问数据“ ? 这和类的封装没有什么关系吧?

应该看具体的需求,比如说 iOS开发 经典的”View 中不写事件逻辑“,可仍然有 Self-Manager模式;

正如楼上所例 view.frame.size.height = 10; view 的 frame 属性只能被重新设置而不能被修改其属性,是为了方便监听frame的变化。

这个问题语言无关,试想一下如果一个类有birthday和age两个属性,这两个属性是不是相关的,如果采用你上述的方法有什么问题?

就像

view.frame.size.height = 10;

不被允许的。

你想表达的是OC中readonly的属性么? 重写getter就好了呀 setter留在方法接口内部,外部只能访问,不能直接操作这个属性,不应该是这样么,Swift中应该也类似的吧

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题