关于Swift 你可能连变量都不会定义

写在开头
很多人说寒哥不写干货 那今天寒哥就狠狠心 写个 (其实不是不写 是太懒了 平时都写在印象笔记中 因为是给自己看的 格式比较散 要写博客 就要认认真真的写 怕误了看官的眼 )

  • 顺便来个广告

iOS开发者 群532084214 给大家提供一个交流技术 也可以聊天打屁的平台

此文默认 读者有iOS开发经验 包括OC Swift 和一点点的runtime的理解

先新建个项目 Swift 和oc都行

新建一个OCClass:NSObject
我们来声明一个成员属性


Paste_Image.png
Paste_Image.png

所有人都知道定义这都ivar的时候 系统会帮你做好几件事
生成带下划线的私有成员属性 对应 的setter 和getter

那么我们来Swift中看一下怎么定义一个成员变量

Paste_Image.png

so easy 这个谁不会嘛 (我这里不讨论可选类型 而是讨论 什么叫做存储变量 什么叫做计算变量)

我们会在想 Swift 会不会像oc一样 给我们同样的生成了 setter 和getter呢
于是有的人会这样写

Paste_Image.png

然后这样调用

Paste_Image.png

然后一运行程序 Crash了 很多人 会说 肯定了 不就是循环调用
断点出的堆栈信息 这样的

Paste_Image.png

很明显 这就是循环调用了 但是你把self.去掉 之后再次运行

Paste_Image.png

还是崩

奶奶的要崩溃了 这是什么鬼

其实Swift设计的初衷和oc并不是特别一样

后文解答

我们先来看一个mvc的结构图

Paste_Image.png
Paste_Image.png

其实在mvc中 View是不能拿到model的 他们互相不知道
但是在开发过程中 我们很多view的数据来源自model 如果我们在外部提供一个一个的属性 然后等着控制器 去赋值 再在对应的setter里面去 修改view 的显示 我们会发现很累 因为一个页面可能有太多属性 所以在大多数情况 我们在view声明一个model的属性 等值控制器去赋值
但是 但是 但是

重要的事情说三遍
我们这样我违反了 mvc的思想 其实(mvvm)也是这样的 view不能拿到model 因为你拿到了model 就可以修改 就会造成页面中的数据不对应
大风险啊 于是Swift中出现了 计算变量这种东西

  • 什么叫计算变量 还有什么叫存储变量 ?
    什么鬼

我们声明了一种变量就是为了存储数据 但是Swift中有一种特殊的变量 叫做 计算变量 这种变量是 不能存放数据 (你特么又在逗我 )

看官 我真的没逗你 是真的 这种变量主要就是为了 在view里面声明一个只读的变量 去来给页面赋值的 例子

Paste_Image.png

这种办法就巧妙的 避开了以前在OC开发iOS时 可能对mvc造成的规则不符的情况

  • 这里出现了其他的情况 就是我真的想拥有一个变量 还想在setter方法里面做些别的操作

这里我们出现了先入为主的观念 很多java C++ 和OC开发者 都以为对于的setter就是对应的Set方法 其实不是这样的额
在Swift中访问控制是有访问控制关键字来决定的

Paste_Image.png

对于的监听方法就变成了这样

Paste_Image.png

在早期 apple 建议开发者 都使用 view 使用kvo去观察model的变化 来给对于的页面赋值 但是也不知道程序员的习惯 还是如何 大家还是我行我素 就在view中拿到model

在Swift中 建议使用计算变量 来给view赋值

  • 关于网上对于计算变量的写法
Paste_Image.png

很多人 都模仿 OC中的写法 自己写个带下划线的私有变量 然后提供 set和get方法 我只能说你根本就没有理解Swift 带着陈旧的思想去学习 多此一举嘛

  • 关于两个问题
  1. 我真的想在计算属性里面存值

  2. 属性观察期的位置 固定了 那以前的kvo怎么办

还记得OC中的面试题吗
category 声明一个property 是什么意思
怎么给category增加成员属性

在oc的category中写了一个property 其实系统帮你做了一个对应的set 和 get方法的声明 具体也不会有私有变量生成 也不会有方法实现 如果你真的要加变量 就要用到kvo的 关联对象 如果你对runtime不熟悉 去简述搜 runtime 很多好文章

Paste_Image.png
Paste_Image.png

在Swift中是这样的

Paste_Image.png

关于kvo Swift的初衷就是为了创造几门极度安全化的语言 所以Swift不建议我们再 使用kvo了 因为 在oc中kvo 会产生 一个私有的中间类 (不懂去看runtime ) 在Swift 真的想用kvo 就要用黑魔法了

参看自喵神的tips

Paste_Image.png

Paste_Image.png
Paste_Image.png
Paste_Image.png

“在 Swift 中使用 KVO 有两个显而易见的问题。
首先是 Swift 的 KVO 需要依赖的东西比原来多。在 Objective-C 中我们几乎可以没有限制地对所有满足 KVC 的属性进行监听,而现在我们需要属性有 dynamic 进行修饰。大多数情况下,我们想要观察的类不一定是 dynamic 修饰的 (除非这个类的开发者有意为之,否则一般也不会有人愿意多花功夫在属性前加上 dynamic,因为这毕竟要损失一部分性能),并且有时候我们很可能也无法修改想要观察的类的源码。遇到这样的情况的话,一个可能可行的方案是继承这个类并且将需”“要观察的属性使用 dynamic 进行重写。比如刚才我们的 MyClass 中如果 date 没有 dynamic 的话,我们可能就需要一个新的 MyChildClass 了:”

最后再来个广告 受到 公众号主人邀请 我的文章也会被发布到这个公众号

                        ** 加个欢迎微信扫码关注吧**
Paste_Image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,835评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,598评论 1 295
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,569评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,159评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,533评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,710评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,923评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,674评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,421评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,622评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,115评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,428评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,114评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,097评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,875评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,753评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,649评论 2 271

推荐阅读更多精彩内容

  • 本文是投稿文章,作者:南栀倾寒(博客) 写在开头 很多人说寒哥不写干货 那今天寒哥就狠狠心 写个 (其实不是不写 ...
    __Lex阅读 999评论 0 1
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 11,618评论 4 59
  • 我读完《白鹿原》便产生了一个疑问:“作家陈忠实在书中为何多次描写女人的乳房?” 我粗略统计了一下,在这部50万字的...
    左手梦圆阅读 2,194评论 1 2
  • 一、标准输入 标准输入可以让用户输入一些输入,能够很好的完成人机交互。在python2.x版本和python3.x...
    转身后的那一回眸阅读 716评论 0 0
  • 看见是爱,听见也是爱。 最近遇到一个有点小自暴自弃的小孩子。说自暴自弃有点夸大主题,说小是因为孩...
    云木西阅读 243评论 0 0