[Swift] 從修改協(xié)議類型的屬性報錯說起 Cannot assign to property

變量如果用let 聲明為協(xié)議,修改它的屬性會報錯弱恒。

例子如下:MyProtocol 是一個協(xié)議询刹,MyClass2是一個類

        let p0 : MyProtocol = MyClass2()  //這樣寫會編譯失敗
        p0.name = "000"

但是,同樣的

變量如果用let 聲明為class左冬,修改它的屬性卻不會報錯桐筏。

完整代碼
protocol MyProtocol {
    var name : String {get set}
}

class MyClass2 : MyProtocol {
    var name : String = "..."
}
  func _case0() {
        var p0 : MyProtocol = MyClass2()
      //let p0 : MyProtocol = MyClass2()  //這樣寫會編譯失敗
        p0.name = "000"
        
        let p1 : MyClass2 = MyClass2()
        p1.name = "111"
    }

所以for in 處理協(xié)議數(shù)組的時候,如果要修改元素的屬性拇砰,也要在for后面增加var

for var item in MyProtocolArray

記住這個規(guī)則好像還不夠....總想要解釋個為什么

所以梅忌,來吧,這里嘗試解釋一波

把之前的協(xié)議用struct實現(xiàn)一遍除破,非常輕松簡單

    struct MyStruct2 : MyProtocol {
        var name : String = "..."
    }

嘗試對let聲明的結(jié)構(gòu)體屬性進行修改的話牧氮,會看到跟協(xié)議一樣的報錯,表現(xiàn)一樣的特性

        var p2 : MyStruct2 = MyStruct2()
        //let p2 : MyStruct2 = MyStruct2() //這樣寫會編譯失敗
        p2.name = "222"
結(jié)論就是

用let聲明的protocol或struct變量瑰枫,都不可以修改其屬性踱葛。除非改為var來聲明

換個更好理解的方式來闡述結(jié)論

1.let聲明的class可以修改其屬性,而let聲明的struct卻不可以

2.protocol背后到底是class還是struct,上下文無法推測光坝。所以swift只能讓protocol表示的變量表現(xiàn)出最保守的struct的特征尸诽,不可以隨意修改其屬性。

把一個let聲明的class變量賦值了另一個實例(這就不是在屬性層級的修改)盯另,結(jié)論肯定是不允許的

其實這里針對第一點性含,可以留一個問題

為什么同樣作為constant,class可以修改其屬性鸳惯,而struct不可以商蕴?

let x : classA = objA叠萍,是讓x指向objA的地址,constant的范疇就是x的這個地址不可以修改绪商。而objA.name等屬性并不在let限定里苛谷。

let y : structA = valA , 是讓 y指向valA這個完整的數(shù)據(jù)區(qū)域,而valA.name是這個數(shù)據(jù)區(qū)域的一部分格郁,自然也是全體都受到了let的限定腹殿。

推論到protocol數(shù)組上

對于這樣的數(shù)組let arr : [MyProtocol], arr[0].name = “123”是不合法的。因為arr[0]是個protocol理张,它應該表現(xiàn)為保守的struct特性赫蛇,所以連同其屬性name一并都是let范疇不可以修改。
as! 為class即可修改name屬性雾叭。
上圖說話


let和protocol數(shù)組
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末悟耘,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子织狐,更是在濱河造成了極大的恐慌暂幼,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件移迫,死亡現(xiàn)場離奇詭異旺嬉,居然都是意外死亡,警方通過查閱死者的電腦和手機厨埋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進店門邪媳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人荡陷,你說我怎么就攤上這事雨效。” “怎么了废赞?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵徽龟,是天一觀的道長。 經(jīng)常有香客問我唉地,道長据悔,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任耘沼,我火速辦了婚禮极颓,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘群嗤。我一直安慰自己讼昆,他們只是感情好,可當我...
    茶點故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著浸赫,像睡著了一般。 火紅的嫁衣襯著肌膚如雪赃绊。 梳的紋絲不亂的頭發(fā)上既峡,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天,我揣著相機與錄音碧查,去河邊找鬼运敢。 笑死,一個胖子當著我的面吹牛忠售,可吹牛的內(nèi)容都是我干的传惠。 我是一名探鬼主播,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼稻扬,長吁一口氣:“原來是場噩夢啊……” “哼卦方!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起泰佳,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤盼砍,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后逝她,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體浇坐,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年黔宛,在試婚紗的時候發(fā)現(xiàn)自己被綠了近刘。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡臀晃,死狀恐怖觉渴,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情积仗,我是刑警寧澤疆拘,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站寂曹,受9級特大地震影響哎迄,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜隆圆,卻給世界環(huán)境...
    茶點故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一漱挚、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧渺氧,春花似錦旨涝、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽慨默。三九已至,卻和暖如春弧腥,著一層夾襖步出監(jiān)牢的瞬間厦取,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工管搪, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留虾攻,地道東北人。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓更鲁,卻偏偏與公主長得像霎箍,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子澡为,可洞房花燭夜當晚...
    茶點故事閱讀 43,543評論 2 349