2017-09-06 4 views
2

ich eine Struktur in einem Viewcontroller habe, die ein paar nicht-optionale Mitglieder wie hat:Nicht optionale Werte in Swift-Struktur gibt optionale Werte

struct MyStruct { 
    let id: Int64! 
    let name: String! 
    func checkValues() -> Bool { 
     if id == nil || name == nil { 
      return false 
     } else { 
      print("id: \(id) name: \(name)"); return true 
     } 
    } 
} 

ich eine Instanz der Struktur in einem anderen VC erstellen (let temp = ViewController.MyStruct(id: 10, name: "Example")) und übergeben Sie es an das, wo ich die Struktur über eine Segue erstellt habe. Wenn temp.checkValues() Ausführung ich

id: Optional(10) name: Optional("Example") 

Von meinem Verständnis von (Nicht-) optionals sollte ich nicht die Optional() bekommen, da ich die Variablen mit ! erklärt. Habe ich falsch verstanden? Im Moment habe ich nur ein Ausrufezeichen gesetzt, wenn ich es benutze. Ich versuchte auch, init in der Struktur zu verwenden, aber das änderte nichts. Da dies nicht so ist (wenn ich richtig liege) Ich fürchte, ich habe das Konzept nicht verstanden ... Bitte sag mir, was mit meinem Code/mir nicht stimmt.

Antwort

7

Habe ich etwas falsch gemacht?

Ja. Ihre Variablen sind Optionale - der Operator ! ist ein Force Unwrap Operator, so dass Ihre Variablen sind implizit unverpackt. Wenn Sie nicht möchten, dass Ihre Variablen Optionals sind, löschen Sie einfach !.

Der Operator ! existiert in Swift, um das Bridging von Objective-C zu erleichtern, zum Beispiel für IBOutlet Variablen. Mit ! Operator abgesehen davon ist eine schlechte Praxis.

+0

Vielen Dank! Das macht Sinn ... Ich hatte den falschen Eindruck, dass ich beim Hinzufügen des '!' Sicherstellen würde, dass sie keine Optionals sein können ... – Michael

5

! ist ein implikatur ausgewickelt optional. Der Typ der Variablendeklaration, der mit !endet, ist optional. Sie müssen sie nicht als Optional s deklarieren. Verwenden Sie sie einfach normal und der Initialisierer wird sie kümmern:

struct MyStruct { 
    let id: Int64 
    let name: String 
    func checkValues() -> Bool { 
     print("id: \(id) name: \(name)"); return true 
    } 
} 
+0

Ja, danke! Das macht Sinn ... – Michael