2017-08-10 6 views
0

Neu bei swift. Soweit ich weiß, Tupel Zuweisungsoperator '?' ist nicht mit Tupel erlaubt.Swift 4: Tupel als optional

var optionalTuple = (String, Int)? // this isn't allowed. 

Gibt es eine Arbeit neben der Zuordnung der Elemente als optional einzeln?

+2

ich denke, es sollte 'var optional: (String, Int)? 'equals ist für die Zuweisung – kathayatnk

+1

' (String, Int)? 'ist ein * Typ, * kein Wert. Möchten Sie eine Variable deklarieren oder ihr einen Wert zuweisen? Was meinst du mit * "die Elemente als optional einzeln zuweisen" *? Was ist das erwartete Ergebnis? –

+0

Ich versuche nur herauszufinden, ob ich ein Tupel als optional erklären kann, nicht die Elemente: var optionalVariable1: String? var optionalVariable2: Int? var optionalTuple = (optionalVariable1, optionalVariable2). Ich glaube, dass kathayatnk Recht hat. var optional: (String, Int)? – seems

Antwort

2

(String, Int)? ist ein Typ, kein Wert, daher kann er nicht auf die rechte Seite von = gesetzt werden.

Wenn Sie nicht bereits wissen, wenn Sie eine Variable/Konstante deklarieren, können Sie den Typ mit der folgenden Syntax angeben:

let/var name: Typ

So eine optionale Tupel Deklaration sieht aus wie dies:

var optionalTuple: (String, Int)? 

Ein anderer Weg, es zu tun, ist dies:

var optionalTuple = (String, Int)?.none 

Die obigen beiden Werte haben den Wert nil. Sie können dies auch auf einen benutzerdefinierten Wert initialisieren:

var optionalTuple: (String, Int)? = ("Hello", 10) 

Ein anderer Weg, dies zu tun ist:

var optionalTuple = (String, Int)?.some(("Hello", 10)) 
1

Tupeln kann als optional deklariert werden, aber Sie scheinen die Art zu verwirrend zu sein und die Wert.

//Type is optional tuple (String, Int), value is nil 
let optionalTuple : (String, Int)? = nil  

//Type is optional tuple (String, Int), value is ("James", 27) 
let optionalTuple : (String, Int)? = ("James", 27) 

//Type is (inferred) optional tuple (String, Int). Value is ("James", 27) 
let optionalTuple = ("James", 27)  

Bei einigen Unit-Tests so können Sie selbst laufen und sehen:

func testTupleOptionality() { 

    func returnOptionalTuple(returnNil:Bool) -> (String, Int)? { 
     if returnNil { 
      return nil 
     } 
     else { 
      return ("James", 27) 
     } 
    } 

    let result1 = returnOptionalTuple(returnNil: true) 
    XCTAssertNil(result1) 

    let result2 = returnOptionalTuple(returnNil: false) 
    XCTAssertNotNil(result2) 
    XCTAssertEqual(result2!.0, "James") 
    XCTAssertEqual(result2!.1, 27) 
} 

func testTupleOptionalityVariable() { 
    let optionalTuple : (String, Int) = nil 
    XCTAssertNil(optionalTuple) 
}