亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在斯威夫特語中,感嘆號是什么意思?

在斯威夫特語中,感嘆號是什么意思?

慕絲7291255 2019-06-23 15:26:44
在斯威夫特語中,感嘆號是什么意思?SWIFT編程語言指南有以下示例:class Person {     let name: String     init(name: String) { self.name = name }     var apartment: Apartment?     deinit { println("\(name) is being deinitialized") } } class Apartment {     let number: Int     init(number: Int) { self.number = number }     var tenant: Person?     deinit { println("Apartment #\(number) is being deinitialized") } } var john: Person? var number73: Apartment? john = Person(name: "John Appleseed") number73 = Apartment(number: 73) //From Apple's “The Swift Programming Language” guide  (https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/AutomaticReferenceCounting.html)然后,當將公寓分配給該人時,他們使用一個感嘆號來“打開實例”:john!.apartment = number73“打開實例”意味著什么?為什么有這個必要?這與只做以下工作有什么不同:john.apartment = number73我對斯威夫特語很陌生。只是想把基本的東西弄下來。最新情況:我漏掉的謎題(在答案中沒有直接說明-至少在寫這篇文章的時候沒有)-就是當你做以下事情時:var john: Person?這并不意味著“john是類型的Person“可能是零”,正如我最初所想的,我只是誤解了這一點。Person和Person?是完全不同的類型。一旦我抓住了這個,所有的人?, !瘋狂,以及下面這些偉大的答案,更有意義。
查看完整描述

3 回答

?
慕桂英3389331

TA貢獻2036條經驗 獲得超8個贊

“打開實例”意味著什么?為什么有這個必要?

就我所能做的(這對我來說也是很新的).

“包裝”一詞意味著我們應該把一個可選的變量當作禮物,包在閃亮的紙里,這可能(可悲的!)空空如也.

當“包裝”時,可選變量的值是帶有兩個可能值的枚舉(有點像布爾值)。此枚舉描述變量是否持有值(Some(T)),或不(None).

如果存在值,則可以通過“解包裝”變量(獲取T從…Some(T)).

你還好嗎john!.apartment = number73不同于john.apartment = number73?(釋義)

如果您寫入可選變量的名稱(如文本)john,沒有!),這指的是“包裝”枚舉(/None),而不是值本身(T)。所以john不是Person,而且它沒有一個apartment成員:

john.apartment
// 'Person?' does not have a member named 'apartment'

實際Person可以各種方式展開值:

  • “強制拆開”:

    john!

    (給出

    Person

    如果存在,則為值,如果為零,則為運行時錯誤)
  • “任擇約束力”:

    if let p = john { println(p) }

    (執行

    println

    (如果存在該值)
  • “可選鏈接”:

    john?.learnAboutSwift()

    (如果值存在,則執行此組合方法)

我猜您選擇了其中一種方式來展開包裝,這取決于在零情況下應該發生什么,以及這種情況發生的可能性有多大。這種語言設計強制顯式地處理零情況,我認為這比Obj-C(這里很容易忘記處理零情況)提高了安全性。

更新:

感嘆號也用于聲明“隱式解包裝選項”的語法中。

在到目前為止的示例中,john變量已聲明為var john:Person?,這是可選的。如果您想要該變量的實際值,則必須使用上述三種方法之一展開它。

如果它被宣布為var john:Person!相反,變量將是一個隱式未包裝的可選項(請參閱Apple書中帶有此標題的部分)。在訪問值時不需要打開此類變量,并且john可以在不使用其他語法的情況下使用。但蘋果的書上說:

當變量可能在以后變為零時,不應使用隱式展開選項。如果需要在變量的生存期內檢查零值,請始終使用普通可選類型。

更新2:

文章“有趣的斯威夫特特征“MikeAsh給出了一些選擇類型的動機,我認為這是偉大的,清晰的寫作?!?/trans>

更新3:

另一篇關于隱式解包可選使用感嘆號:“斯威夫特與最后一英里這篇文章解釋說,這是蘋果公司的一項實用措施,用于聲明它們的目標-C框架所使用的類型,其中可能包含零。聲明類型為可選類型(使用?)或隱式展開(使用!)是“安全和方便之間的權衡”。在本文中給出的示例中,Apple選擇將這些類型聲明為隱式解包裝,從而使調用代碼更方便,但安全性更低。

也許蘋果將來可能會梳理它們的框架,根據目標C代碼的準確行為,消除隱式展開(“可能永遠不會為零”)參數的不確定性,并將其替換為可選(“當然可以是零,特別是[希望,文檔!]環境”)或標準的非可選聲明(“從不為零”)。


查看完整回答
反對 回復 2019-06-23
?
繁華開滿天機

TA貢獻1816條經驗 獲得超4個贊

我認為不同之處在于:

var john: Person?

意味著約翰可以是零

john?.apartment = number73

編譯器將這一行解釋為:

if john != nil {
    john.apartment = number73
}

john!.apartment = number73

編譯器將這一行簡單地解釋為:

john.apartment = number73

因此,使用!將打開if語句,使其運行得更快,但如果John為0,則會發生運行時錯誤。

所以這里的包裝并不意味著它是內存包裝的,但它意味著它是被代碼包裝的,在本例中它是用if語句包裝的,而且由于Apple非常關注運行時的性能,所以他們希望給您一種方法,使您的應用程序能夠以最好的性能運行。

最新情況:

四年后回到這個答案,因為我在Stackoverlow中獲得了最高的聲譽:)當時我有點誤解了展開的意義?,F在,4年后,我相信在這里展開的意義是擴展代碼,從它原來的緊湊形式。同時,它也意味著消除對象周圍的模糊性,因為我們不能確定它的定義是否為零。就像上面艾希禮的回答一樣,把它當作一件禮物,里面什么也不包含。但我仍然認為展開是代碼展開,而不是使用枚舉時基于內存的展開。


查看完整回答
反對 回復 2019-06-23
  • 3 回答
  • 0 關注
  • 682 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號