"?" İle hızlı değişken süslemeler (soru işareti) ve "!" (ünlem işareti)


106

Swift'de tüm değişkenlerin bir değerle ayarlanması gerektiğini ve isteğe bağlı ifadeler kullanarak nilbaşlangıçta ayarlanacak bir değişken ayarlayabileceğimizi anlıyorum .

Anlamadığım şey, a ile bir değişkeni ayarlamanın ne !yaptığı, çünkü bunun isteğe bağlı bir değerden bir değeri "çözdüğü" izlenimi altındaydım. Bunu yaparak, bu değişkende sarmalanacak bir değer olduğunu garanti ettiğinizi düşündüm, bu yüzden IBActions'da ve bunun kullanıldığını görüyorsunuz.

Basitçe söylemek gerekirse, böyle bir şey yaptığınızda ilklendirilen değişken nedir:

var aShape : CAShapeLayer!

Ve bunu neden / ne zaman yapmalıyım?


Bunu, bu gerçeği kontrol ettikten sonra bir değişkenin nt nil olduğunu söylemek için yaparsınız .
Matthias

Bunun kopya olarak işaretlenmesi gerektiğini sanmıyorum. "İsteğe bağlı nedir?" "iki tür isteğe bağlı seçenek arasındaki fark nedir?" ile aynı soru değildir. bu soru
aşağı yukarı

@Jiaaro bu durumda bile, isteğe bağlı, örtük olarak açılmamış isteğe bağlı seçenekler ve benzerleriyle ilgili tonlarca soru var.
Jack

@JackWu Tamam, ama bu sorunun sorulduğunda bir kopya olmadığından oldukça eminim. (örneğin, sizin örneğinizden tam bir hafta önce sorulmuştu)
Jiaaro

@Jiaaro İyi bir noktaya değindin, bunun daha eski olduğunu fark etmedim ... belki de diğerinin bunun yerine bunun kopyası olarak işaretlenmesi gerekiyor ..
Jack

Yanıtlar:


145

Bir tür bildiride !benzer ?. Her ikisi de isteğe bağlıdır, ancak !" örtük olarak sarmalanmamış" isteğe bağlıdır , yani değere erişmek için onu sarmalamanız gerekmez (ancak yine de sıfır olabilir).

Bu temelde zaten hedef-c'de sahip olduğumuz davranış. Bir değer sıfır olabilir ve onu kontrol etmeniz gerekir, ancak değere sanki isteğe bağlı değilmiş gibi doğrudan da erişebilirsiniz (önemli fark şu ki, sıfır olup olmadığını kontrol etmezseniz bir çalışma hatası)

// Cannot be nil
var x: Int = 1

// The type here is not "Int", it's "Optional Int"
var y: Int? = 2

// The type here is "Implicitly Unwrapped Optional Int"
var z: Int! = 3

Kullanım:

// you can add x and z
x + z == 4

// ...but not x and y, because y needs to be unwrapped
x + y // error

// to add x and y you need to do:
x + y!

// but you *should* do this:
if let y_val = y {
    x + y_val
}

7
Örtülü olarak açılmamış opsiyonlar, Swift Programlama Dili'nin 56. sayfasından itibaren uygun şekilde adlandırılmış bir bölümde açıklanmaktadır .
Caleb

@Caleb Örtülü olarak paketlenmemiş seçeneklerden bahsettiğim çevrimiçi belgelerin ilgili bölümüne bir bağlantı ekledim :)
Jiaaro

Harika bilgi, teşekkürler. Genel olarak Swift'in bize dayattığı güvenliği sevmek çok daha az hata üretecektir :).
Jason Renaldo

@Jiaaro: Paylaştığınız için çok teşekkür ederim. Yukarıdaki örnekle kullanıcının mükemmel bir şekilde anlamasını sağlar. !! :)
Esha

3
" Bu temelde hedef-c'de zaten sahip olduğumuz davranış " cümlesinin kafa karıştırıcı olabileceğini düşünüyorum. Objektif-c biri erişebilirsiniz nil's nil ise değeri ve bir örtük Çizelgesi Seçimlik erişen Swift onunla aslında "iş", olacak bir çalışma zamanı istisnası.
Sascha Wolf
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.