2015-08-01 22 views
6

İsteğe bağlıların nasıl çalıştığını anlıyorum, ancak bu bir döngü için beni fırlatıyor. Ben num adlı bir değişken var ve bunu artırmak istediğiniz, bu yüzden aşağıdaki yaptı: Swift artışı Int! çalışmıyor

var num:Int! = 0 
num++    //ERROR - Unary operator ++ cannot be applied to an operand of type Int! 

Ama

tedavi olması gerekiyordu rağmen Swift bana bir kuvvet Int açılmamış artırır izin vermez Bazı sebeplerden dolayı, sahnelerin arkasında nil yeteneğine sahip düzenli bir Int gibi. Bu yüzden aşağıdaki çalıştı ve işe yaradı:

o bana verdi hata mesajına göre Bununla
var num:Int! = 0 
num = num + 1  //NO ERROR 

, ben artım operatörü olmak için aşağıdaki çalıştı hala çalışır:

var num:Int! = 0 
num!++   //NO ERROR 

Benim sorum Kodun ikinci ve üçüncü bitleri neden ilk kod bitini kırıyor? Ayrıca, num bir Int! olduğundan, düzenli bir Int gibi davranamayabilir miyim? Son olarak, bir Int!'un düzenli bir Int gibi ele alınması gerektiği için, üçüncü örnekte nasıl paketleyemiyorum? Teşekkürler.

+1

Hemen "0" olarak başlattığınız için, isteğe bağlı olmak zorunda değil. – Jack

+1

başlatıcılara ihtiyaç duymadan "var num = 0" değerine sahip olabilirsiniz. Bilgi için teşekkürler, fakat ne olursa olsun neden yukarıdaki kodum garip oluyor? – Aderis

+0

@JackWu: İsteğe bağlı yapmak, bunun için bir nedeniniz varsa daha sonra sıfırlayabileceğiniz anlamına gelir. – gnasher729

cevap

1

Bu hata tüm inout parametrelerle ortaya çıkar ve bir hata düşünülmelidir kullanın.

inout parametrelerinin nasıl çalıştığına dair alışılmış şekilde, alıcılarının bir kez ve ayarlayıcıları en az bir kez çağrılmalarıdır. Bu durumda alıcı bir Int! döndürür: böylece alıcı/setter imzası işleviyle aynı değildir

let num: Int! = 0 
let num2 = num // is inferred to be of type Int! 

/operatör bekliyor. bir Int atanmış veya geçirilen şöyle alırsa Ama derleyici örtük değerini paketini olmalıdır:

var num3 = 0 // is of type Int 
num3 = num // gets automatically unwrapped 

// also with functions 
func someFunc(i: Int) {} 
someFunc(num) // gets automatically unwrapped 

Sidenote: Bir ile bir işleve bir Int geçirmek istiyorsanız

Neredeyse aynı hata oluşur inoutInt! türünde bir parametre. Ama işte bu, neden işe yaramadı? (Mantıksal olarak): Int'un ayarlayıcısı asla nil'u almaz.

-3
Yanlış tip Int! kullanırken

, Int yerine

+0

Bunu, bir init() 'yöntemine sahip olmayan bir ViewController'da kullanıyorum ve tüm başlatımım viewDidLoad öğesinde gerçekleştiriliyor, bu yüzden bir çeşit isteğe bağlı olmalı ve istemiyorum o zaman bir "Int" yapalım çünkü o zaman her yerde soru işaretleri ile uğraşmak zorunda kaldım ve "viewDidLoad" – Aderis

+0

numaranın ardından "var num = 0" bildirim satırındaki başlatma işlemini yaptıktan sonra her zaman bir değeri vardır. 'Int', varsayılan tip – vadian

+0

'dır. Bilgileriniz için teşekkürler, fakat ne olursa olsun, isteğe bağlı olarak neden kodum tuhaf oluyor? – Aderis