Swift nida işarəsi nə deməkdir?

Swift Proqramlaşdırma Dili Manualı aşağıdakı nümunəyə malikdir:

 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 "The Swift Programming > 

Sonra bir şəxsə mənzillər təyin edərkən, "bir nümunəni açmaq" üçün nida işarəsi istifadə olunur:

 john!.apartment = number73 

"Nümunə tətbiq etmək" nə deməkdir? Niyə bu vacibdir? Aşağıdakıları nə ilə fərqlənir:

 john.apartment = number73 

Mən Swift dilində çox yeniyim. Yalnız əsasları aradan qaldırmağa çalışırıq.


ƏLAVƏ OLUNUB:
Mənim itkin olduğum tapmacaların əksəriyyəti (cavabdehdə açıq-aydın şəkildə ifadə olunmur - ən azı bu yazı zamanı deyil) aşağıdakıları yerinə yetirərkən:

 var john: Person? 

mən ilk növbədə düşündüm ki, " john növü Person və sıfır ola bilər" demək deyil. Mən yalnız PersonPerson? səhv olduğunu anladım Person? tamamilə ayrı bir növüdür. Bunu anladığım anda, bütün digər dəlilik ? ! Aşağıdakı böyük cavablar daha mənalı idi.

479
03 июня '14 в 17:52 2014-06-03 17:52 Troy , 03 iyun 'da 17:52' də təyin olunub
@ 23 cavab

"Nümunə tətbiq etmək" nə deməkdir? Niyə bu vacibdir?

Bunu nə qədər edə bilərəm (bu mənim üçün də çox yeni) ...

"Bükülmüş" sözü , ehtiyatlı bir dəyişənin parlaq kağıza sarılan bir hədiyyə olaraq düşünmək lazım olduğunu (kədərlə!) Boş ol .

Boşaldıqda, isteğe bağlı bir dəyişənin dəyəri iki mümkün dəyərə (bir az mantıksal) malik olan bir numaralandır. Bu enum dəyişən bir dəyər ( Some(T) ) saxlayır və ya olmadığını təsvir edir (yox).

Bir dəyər varsa, bu dəyişən ( T Some(T) T alınması) tərəfindən "açmaq" tərəfindən əldə edilə bilər.

john!.apartment = number73 john.apartment = number73 fərqlənir? (Parafraz)

İstədiyiniz dəyişənin adını yazarsanız (məsələn, mətn john olmadan ! ), Bu, dəyərin özü (T) deyil, "sarılan" siyahıya (Bəzi / Həyat) aiddir. Beləliklə, john Person bir nümunəsidir və onun bir apartment üzvü yoxdur:

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

Person faktiki dəyəri müxtəlif yollarla genişləndirilə bilər:

  • "zorla yerləşdirmə": john! (şəxsin dəyərini verir, əgər varsa, runtime səhvi, sıfırsa)
  • "İsteğe bağlı bağlama": if let p = john { println(p) } (bu dəyər varsa println icra println )
  • "İsteğe bağlı zəncir": john?.learnAboutSwift() (bu dəyər varsa bu işlənmiş metodu həyata keçirir)

Hesab edirəm ki, nil vəziyyətində nə baş verə bilər və mümkün qədər asılı olaraq bu yollardan birini seçəcəksiniz. Bu dil dizaynı, nil iddiasının açıq şəkildə işlənməsinə səbəb olur və bu, Obj-C-nin təhlükəsizliyini artırır (bu işi nil ilə həll etmək asan olarsa).

Yeniləmə

Ünlem işareti, "Kapalı olaraq devre dışı olan variantları" bildirmek üçün sözdiziminde də istifadə olunur.

Misallarda, john dəyişən var john:Person? elan var john:Person? və bu isteğe bağlıdır. Bu dəyişənin faktiki dəyərini istəyirsinizsə, yuxarıda göstərilən üç üsuldan birini istifadə edərək genişləndirməlisiniz.

Əgər var john:Person! elan olunarsa var john:Person! əvəzinə, dəyişən seçici olaraq əlil olaraq əlil olacaqdır (Apple kitabında bu başlığı olan bölümə baxın). Qiymətə girərkən bu dəyişənin genişləndirilməsinə ehtiyac yoxdur və john əlavə sintaksis olmadan istifadə edilə bilər. Ancaq Apple kitabında deyilir:

Dəyişəndən sonrakı nöqtədə sıfır olma ehtimalı olduqda, geniş şəkildə genişləndirilə bilən isteğe bağlı variantlardan istifadə edilməməlidir. Değişkenin ömrü boyunca sıfırın değerini kontrol etmeniz gerekiyorsa, həmişə adi isteğe bağlı növü istifadə edin.

Update 2 :

Mike Ash tərəfindən hazırlanan " Maraqlı Quick Features " məqaləsi isteğe bağlı növlərə bəzi motivasiya verir. Hesab edirəm ki, bu gözəl, aydın bir məktubdur.

Update 3 :

Bir ünsiyyət markası üçün dolaşıq alternativ istifadə haqqında başqa bir faydalı məqalə: Chris Adamson'ın Swift və Son Mili . Məqalədə bildirilir ki, bu, Apple-ın Objective-C çərçivələrində istifadə olunan növlərin sıfır ola biləcəyini bəyan edən pragmatik bir tədbirdir. Bir növü isteğe bağlı olaraq elan edir (istifadə ? ) Və ya örtülü olaraq istifadə olunur (istifadə ! ) "Təhlükəsizlik və rahatlıq arasında uzlaşma". Bu yazıda nümunələrində, Apple tipləri gizli şəkildə yerləşdirilən elan edir, bu da zəng kodu daha rahat, lakin daha az təhlükəsiz edir.

Yəqin ki, Apple gələcəkdə çərçivələrini çap etdirməklə, örtülü şəkildə quraşdırılmış parametrlərin qeyri-müəyyənliyini ("bəlkə heç sıfır") aradan qaldırmaq və onları isteğe bağlı olaraq əvəz etməklə mümkündür ("mütləq, ola bilər, xüsusən də sıfır, xüsusilə də [ümid edirəm, sənədləşdirilmişdir!] Vəziyyətlər") və ya standart Objective-C kodunun dəqiq davranışına əsasən isteğe bağlı ("heç vaxt sıfır") bildirişlər.

493
03 июня '14 в 20:04 2014-06-03 20:04 Cavab Ashley tərəfindən 03 iyun 'da saat 20:04' də verilir 2014-06-03 20:04

Fərqli olduğumu düşünən budur:

 var john: Person? 

John qurğuları nil ola bilər

 john?.apartment = number73 

Derleyici bu xəttini aşağıdakı kimi şərh edir:

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

Baxmayaraq

border=0
 john!.apartment = number73 

Derleyici bu xəttini sadə olaraq şərh edir:

 john.apartment = number73 

Buna görə də istifadə edin! if ifadəsini genişləndirir və daha sürətli işə sala bilər, amma john sıfırsa, bir runtime səhvi meydana gələcək.

Beləliklə, burada bənövşəyinin yaddaşda saxlanıldığı demək deyil, ancaq kodun bükülmüş olması deməkdir, bu halda bir if ifadə ilə bükülür və Apple iş müddəti performansına diqqət yetirildikdən sonra ərizə işini aparmaq üçün bir yol vermək istəyirlər maksimum performans ilə.

Yeniləmə:

Bu cavaba 4 il sonra döndüyüm, Stackoverflow'da ondan ən yüksək nüfuza sahib oldum :) O vaxt mənə yerləşdirmə mənasını yanlış anladım. İndi, 4 ildən sonra, buradakı mənanın kodunu orijinal kompakt formadan kodlaşdırmaq olduğuna inanıram. Bu da bu obyektin ətrafında qeyri-müəyyənliklərin aradan qaldırılması deməkdir. Yukarıdakı Ashleyin cavabı kimi, onu bir şey içində saxlaya bilməyən bir hədiyyə olaraq düşünün. Amma hələ düşünürəm ki, açılma kodun açılmasıdır və bir numaralandırmadan istifadə edərək yaddaşa əsaslanmır.

119
20 июня '14 в 7:16 2014-06-20 07:16 cavab 20 iyun 2014-cü il tarixində 7: 16-da veriləcək

Tl; DR

Swift nida işarəsi nə deməkdir?

Ünlenti nişanı effektiv şəkildə deyir: "Mən bilirəm ki, bu isteğe bağlı bir dəyər var, istifadə edin." Bu seçim dəyərinin tətbiq edilməsi adlanır:

Misal

 let possibleString: String? = "An optional string." print(possibleString!) // requires an exclamation mark to access its value // prints "An optional string." let assumedString: String! = "An implicitly unwrapped optional string." print(assumedString) // no exclamation mark is needed to access its value // prints "An implicitly unwrapped optional string." 

Mənbə: https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_>

Əgər john istisna bir var idi (bu şəkildə elan edilmişdi)

 var john: Person? 

sonra john üçün bir dəyərə sahib olmaq mümkün olmazdı (ObjC dilində, dəyər nil)

Ünlem məqamı əsasən kompilyatora deyir: "Mən bilirəm ki, vacibdir, onu yoxlamaq lazım deyil". Bunu istifadə etmək istəmirsinizsə, şərti olaraq test edə bilərsiniz:

 if let otherPerson = john { otherPerson.apartment = number73 } 

Bunun içərisində yalnız john dəyərinin qiymətləndirilməsi olacaq.

37
03 июня '14 в 18:00 2014-06-03 18:00 Cavab Ben Gottlieb tərəfindən 03 iyun '18' də 18:00 'də 2014-06-03 18:00 ' də verilir

Digər faydalı, lakin daha ətraflı cavabları əlavə etmək üçün bəzi böyük şəkil:

Swift-də bir neçə ünsiyyətdə ünlem işareti görünür:

  • Force let name = nameLabel!.text : let name = nameLabel!.text
  • Daxili olaraq yerləşdirilən var logo: UIImageView! : var logo: UIImageView!
  • logo.image = thing as! UIImage döküm: logo.image = thing as! UIImage logo.image = thing as! UIImage logo.image = thing as! UIImage logo.image = thing as! UIImage
  • İşlənməmiş istisnalar: try! NSJSONSerialization.JSONObjectWithData(data, []) try! NSJSONSerialization.JSONObjectWithData(data, []) try! NSJSONSerialization.JSONObjectWithData(data, []) try! NSJSONSerialization.JSONObjectWithData(data, [])

Onların hər biri fərqli bir dil anlayışı ilə fərqli bir məna qurur, ancaq bunların hamısı üç əhəmiyyətli şeydir:

1. Təhlükəsizliyə nəzarət edərkən hörmət əlamətləri bypass süpürür.

İstifadə etdiyiniz zaman ! Swift-də siz əsasən deyirsiniz: "Hey, tərtibçi, bilirəm ki, burada bir səhv ola bilər, amma bu, heç vaxt baş verməyəcəkdir."

Bütün qüvvədə olan kodlar Swifts tipli tərtib sisteminə - ya da istənilən dilin statik tipli yoxlamalarına uyğun deyildir. Mantıksal bir səhvin heç vaxt baş verməyəcəyini sübut edə biləcəyiniz bir vəziyyət var, ancaq bunu derleyiciye kanıtlayamıyorsunuz. Buna görə Swifts Dizaynerlər ilk olaraq bu xüsusiyyətləri əlavə etdi.

Ancaq istifadə etdiyiniz zaman ! səhv üçün bərpa yolunu istisna etmirsiniz, yəni ...

2. Ünlem işaretleri potensial uğursuzluqlardır.

Ünlem qeydində də belə deyilir: "Hey, Swift, mən bu səhvin heç bir zaman baş verə bilməyəcəyinə əminəm ki, mənim bütün tətbiqimi məhv etmək daha yaxşıdır ki, bunun üçün bir bərpa yolunu kodlaşdırsın".

Bu təhlükəli bir bəyanatdır. Bu düzgün ola bilər: kritik kritik kodda, kodunuzu dəyişənlər haqqında düşündüyünüz yerlərdə, kupe çıxışının qəzadan daha pis olması ola bilər.

Ancaq gördükdə ! yabanı, nadir hallarda çox zehni istifadə olunur. Bunun əvəzinə, bu çox tez-tez deməkdir ki, "bu dəyər isteğe bağlıdır və mən niyə sıfır ola bilər və ya bu vəziyyəti necə düzgün idarə edə biləcəyini çox düşünmürəm, amma əlavə ! ... ! bunu bir tərtib etdi ... mənim kodu düzgün, siz deyilsiniz? "

Hörmət işarəsinin təkəbbürünü çəkin. Əvəzinə ...

3. Ünlem işarələri ən yaxşı şəkildə istifadə olunur.

Onların hər biri ! Designs var ? səhv / sıfır ilə məşğul olur:

  • Şərti yerləşdirmə: if let name = nameLabel?.text {... }
  • var logo: UIImageView? : var logo: UIImageView?
  • Şərti döküm: logo.image = thing as? UIImage logo.image = thing as? UIImage logo.image = thing as? UIImage logo.image = thing as? UIImage
  • Nil-on-uğursuz istisnalar: try? NSJSONSerialization.JSONObjectWithData(data, []) try? NSJSONSerialization.JSONObjectWithData(data, []) try? NSJSONSerialization.JSONObjectWithData(data, []) try? NSJSONSerialization.JSONObjectWithData(data, [])

Istifadə etmək istəsəniz ! , hər zaman nəyə görə istifadə etməyinizi ? əvəzinə. Proqramınızın uğursuz olması həqiqətən ən yaxşı seçimdir ! işləmir? Niyə bu dəyər optional / imkansızdır?

Nil / səhv halında kodunuzun qəbul oluna biləcəyi bir ağlabatan bərpa yolu varmı? Bəli, əgər kodu varsa.

Nil olamazsa, bir səhv baş verə bilməzsə, o zaman kompilyator bunu bilməsi üçün məntiqinizi düzəltmək üçün ağlabatan bir üsul varmı? Əgər belədirsə, bunu et; kodunuz daha az səhv olacaq.

Səhvlə mübarizə aparmaq üçün həssas bir yol olmadığını və sadəcə səhvləri yox sayan və bu səbəblə yanlış məlumatların işlənməsinin baş vermədikdən daha pis olacağı hallar var. Bunlar güc tətbiq etməlisiniz.

Mən dəfələrlə mənim bütün kod bazamdan baxıram ! və hər bir istifadə test. Çox az gömrük dayanıb. (Bu yazı zamanı bütün Siesta infrastrukturu tam olaraq iki halına malikdir.)

Bu, heç vaxt istifadə etməyin demək deyil ! kodunuzda, bunu yalnız bilinçli olaraq istifadə etməli və default olaraq bunu etməməlisiniz.

25
28 окт. Paul Cantrell tərəfindən verilmiş cavabı Oct 28 2015-10-28 22:30 '15 saat 10:30 'da 2015-10-28 22:30

john isteğe bağlıdır. Beləliklə, dəyər nil müəyyən edilə bilər. Qiymətin nil olmadığını təmin etmək üçün istifadə edin ! adının sonunda var .

Sənədlərdən

"Parametr dəyərinin mütləq bir dəyərə malik olmadığından əmin olduğunuzdan sonra, bir ünlem işareti (!) Əlavə edərək əsas dəyərinə daxil ola bilərsiniz. Seçimlərin adının bitməsinə görə:" Bu seçimin mütləq olduğunu bilirəm " məsələlər; istifadə edin.

Nilin dəyərini yoxlamaq üçün başqa bir vasitədir

  if let j = json { // do something with j } 
24
03 июня '14 в 17:54 2014-06-03 17:54 Cavab Fry tərəfindən 03 iyun 'da 17:54' də verilir 2014-06-03 17:54

Burada bəzi nümunələr var:

 var name:String = "Hello World" var word:String? 

word isteğe bağlı bir dəyərdir. bir dəyər ehtiva edə biləcəyini və ya olmamasını nəzərdə tutur.

 word = name 

Burada name bir dəyərə sahibdir, ona görə də onu təyin edə bilərik

 var cow:String = nil var dog:String! 

dog ətrafa dönmək məcburiyyətində olduğu halda dəyəri ehtiva etməsi deməkdir

 dog = cow 

nil üçün nil üçün tətbiq uğursuz olacaq

16
10 июля '15 в 11:32 2015-07-10 11:32 Cavab Ramkumar chintala'ya 10 İyul, '15 'də 11:32' də verilir. 2015-07-10 11:32

Bu vəziyyətdə ...

var John: Şəxsiyyət!

Bu, ilk növbədə, Yəhyanın bir nil dəyərinə malik olacağı deməkdir, müəyyənləşdiriləcək və bir dəfə qurulacaqdır, heç vaxt yenidən nil rəhbərlik etməyəcəkdir. Buna görə rahatlığı təmin etmək üçün, isteğe bağlı bir bara daxil olmaq üçün daha asan bir sintaksis istifadə edə bilərəm, çünki bu, "gizli şəkildə genişlənmiş isteğe bağlı"

13
25 июля '14 в 0:50 2014-07-25 00:50 Qonaq tərəfindən cavab 25 iyul '14 'də 0:50 2014-07-25 00:50
 var currentTitle:String? //currentTitle = "Title Name" println("title: \(currentTitle?)") //title: nil println("title: \(currentTitle!)") //runtime exception var currentTitle:String? currentTitle = "Title Name" println("title: \(currentTitle?)") //title: Optonal("Title Name") println("title: \(currentTitle!)") //title: Title Name 

Bəzi hallarda, isteğe bağlı dəyər nil olduqda irəli hərəkət edə bilmirik

5
05 дек. Cavab verilir 05 dekabr. 2017-12-05 23:18 '17 saat 11:18 'da 2017-12-05 23:18

Bir C-ailə dilindən gəlsəniz, "0 (NULL) yaddaş ünvanı ola bilən X tipli bir obyektə bir göstərici" düşünürsünüz və dinamik şəkildə yazılmış bir dildən gəlsəniz, "düşünün" X tipindədir, ancaq müəyyən olmayan bir növü ola bilər. "Birincisi yaxınlaşdıqlarına baxmayaraq onların heç biri doğru deyil.

Bu barədə fikirləşməyin yolu, sanki bir obyekt kimi idi:

 struct Optional<T> { var isNil:Boolean var realObject:T } 

foo.isNil dəyəri foo == nil ilə test etdikdə, həqiqətən foo.isNil qaytarır və foo! deyərkən foo! foo.isNil == false olduğunu foo.isNil == false qaytarır. Bunu qeyd etmək vacibdir, çünki foo əslində nil deyil, foo! etdiyiniz zaman foo! Bu, bir runtime səhvidir, belə ki, dəyərin sıfır olacağına əmin deyilsinizsə, adətən yerinə şərti qətnamə istifadə etmək istəyirik. Bu cür aldatma, dəyərlərin hər yerdə sıfır olub olmadığını yoxlamağa məcbur etmədən bir dilin güclü şəkildə yazıla biləcəyini bildirir.

Praktikada bu həqiqət deyil, çünki iş kompilyator tərəfindən həyata keçirilir. Yüksək səviyyədə Foo? növü Foo? foo bölünür və bu foo növü dəyər nil almaq üçün almaq funcs, lakin aşağı səviyyədə, opaqlı dəyəri xüsusiyyətləri və üsulları yoxdur, çünki əsl obyekt deyil, qarşısını alır; əslində qüvvəyə yerləşdirmə zamanı müvafiq test ilə NULL (0) istifadə edilə bilən bir göstəricidir.

Bir nida işarəsi gördüyünüz bir vəziyyət növüdür, məsələn:

 func foo(bar: String!) { print(bar) } 

Bu, məcburi bir scan ilə isteğe bağlı bir şəkildə qəbul edilməsinə təxminən bərabərdir, yəni:

 func foo(bar: String?) { print(bar!) } 

Bunu texniki cəhətdən isteğe bağlı bir dəyər götürən bir üsula sahib olmaq üçün istifadə edə bilərsiniz, ancaq sıfır olduqda bir runtime səhviniz olacaq. Swift'in mövcud versiyasında, bu is-not-nil ifadəsini atlatmak üçün görünür, bunun yerine aşağı səviyyəli bir səhv alacaqsınız. Bir qayda olaraq bu yaxşı bir fikir deyil, ancaq kodu başqa bir dildən çevirərkən faydalı ola bilər.

4
19 февр. Cavab 19 fevralda Jim Driscoll tərəfindən verilir . 2016-02-19 13:52 '16 saat 13:52 'də 2016-02-19 13:52

Budur! bir obyektin ortaya çıxardığı qüvvəsidir! Aşağıdakı kimi. Daha çox məlumatı burada tapa bilərsiniz olan alma sənədlərində tapa bilərsiniz: https://developer.apple.com/library/ios/documentation/swift/conceptual/Swift_Programming_>

16 нояб. Henry oscannlain-miller tərəfindən verilmiş cavab 16 noyabr 2014-11-16 05:30 '14 'də 5:30' də 2014-11-16 05:30

C # ilə tanış olsanız, bu bir sual işarəsi ilə də elan edilən Nullable tiplərə bənzəyir:

 Person? thisPerson; 

Və bu vəziyyətdə ünsiyyət nöqtəsinə daxil olmaq üçün bərabərdir .Value xüsusiyyətinin növü nullable, məsələn:

 thisPerson.Value 
3
20 окт. Abdurrahmanın 20 oktyabr tarixində verdiyi cavab . 2015-10-20 17:23 '15 'da 17:23' də 2015-10-20 17:23

Cədvəl dəyişkənliklərində C dəyərində olmayan "nil" (siz də "nil" dəyərlərdən istifadə edə bilərsiniz, 0 ilə yanlış), beləliklə şərti operatorlardakı dəyişənləri istifadə edə bilərsiniz ("TRUE" ilə eyni dəyərlərə malik dəyişənlər və heç bir dəyərsiz olanlar "FALSE" e bərabərdir).

Swift, "isteğe bağlı dəyər" təmin edərək tip təhlükəsizliyi təmin edir. yəni, müxtəlif növ dəyişənləri təyin edərkən səhvlərin yaranmasına mane olur.

Beləliklə, Swift, yalnız Boolean şərtli ifadələr üçün təmin edilə bilər.

 var hw = "Hello World" 

Burada, "hw" bir simli olsa da, C obyektində olduğu kimi bir if ifadəsində istifadə edilə bilməz.

 //This is an error if hw {..} 

Bunu etmək üçün, bunun kimi yaradılmalıdır

 var nhw : String? = "Hello World" //This is correct if nhw {..} 
2
19 июня '14 в 9:59 2014-06-19 09:59 Cavab 19.06.14 tarixində Gökül tərəfindən 9:59 2014-06-19 09:59 tarixində verilir

Budur! bir obyektin sonunda obyektin isteğe bağlı olduğunu və başqa bir şəkildə sıfır döndüyünü genişləndirdiyini söyləyir. Bu, tez-tez proqramı aradan qaldıra biləcək səhvləri tutmaq üçün istifadə olunur.

2
09 июня '15 в 9:09 2015-06-09 09:09 Cavab çəyirdək verilir 09 İyun 09:15 'da 09:09 2015-06-09 09:09

Qısacası (!): Bir dəyişən elan etdikdən sonra dəyişən məsələlərdən əmin olun.

 let assumedString: String! = "Some message..." let implicitString: String = assumedString 

əvəzində dəyərini keçdikdən sonra hər birinə bunu etmək lazımdır ...

 let possibleString: String? = "An optional string." let forcedString: String = possibleString! // requires an exclamation mark 
2
07 янв. cavab En Hui Lim 07 yanvar 2016-01-07 10:53 '16 saat 10:53 'da 2016-01-07 10:53

Əlavə dəyişən dəyər ehtiva edə bilər və ya ola bilməz

Case 1: var myVar:String? = "Something" var myVar:String? = "Something"

Case 2: var myVar:String? = nil var myVar:String? = nil

İndi, mənim vərəmi soruşarsan, kompilyator 1-də dəyər qaytarmaq üçün deyirsinizsə, "Something"

2 halda uğursuz halda.

Anlam! marka kompilyator, hətta olmasa belə bir dəyəri qaytarmağa məcbur edəcəkdir. bu səbəbdən Force Unwrapping adı.

1
06 сент. Cavab Ashish Pisey tərəfindən verilib 06 Sep. 2017-09-06 16:47 '17 'da 4:47' də 2017-09-06 16:47 'də

Sadəcə qoymaq, nida işarələri mütləq açılmaması deməkdir. İstədiyiniz bir dəyəri ola bilən və ya dəyişən bir dəyişəndir, belə ki, burada göstərildiyi kimi , əgər bildiriş verilsəydi, dəyişənin boş olduğunu yoxlaya bilərsiniz və daha sonra onu genişləndirməyə məcbur edə bilərsiniz. Boş olan bir variantı zorla genişləndirirsinizsə, proqramınız uğursuz olacaq, buna görə diqqətli olun! Опционы объявляются, помещая знак вопроса в конце явного присваивания переменной, например, я мог бы написать:

 var optionalExample: String?