2015-12-08 14 views
8

Ich frage mich, ob es bottom type in der Swift-Sprache gibt.Bottom Type in Swift

Um irgendeine Verwirrung vorher auszusortieren, ist unit type eine andere Art als unterer Typ, da wir es als Void oder () in swift haben. Auch Any ist Top-Typ.

Was ich gefunden habe, die am nächsten zu sein, überraschend, ist @noreturn Attribut in Form von fatalError(), dass wir meist Pass diese Funktion zu meisten gegeben beliebigen Typ übereinstimmen.

Aber natürlich, das ist unvollständig und somit ein schlechter Ersatz für einen echten Bodentyp wie zum Beispiel Nothing in Scala, undefined in Haskell oder sogar null in Java.

Also, gibt es einen Bottom-Typ in Swift-Sprache?

+3

Ich kippe Sagen Sie, ich habe alles gesehen, wonach Sie fragen. In welchem ​​Fall möchten Sie diesen unteren Typ verwenden? – Arbitur

+1

@Arbitur Aus der Sicht einer Sprache spielt sie auf die Vollständigkeit des Typsystems an. Aus praktischen Gründen können Sie einen Typ ausdrücken, der alle Typen erweitert. Dies wird nützlich, wenn bestimmte Verhaltensweisen mit Typinferenz behandelt werden. Sie können auf [dies] verweisen (http://programmers.stackexchange.com/questions/277197/is-there-a-reason-to-have-a-bottom-type-in-a-programming-language). –

Antwort

2

Es gibt keine Bottom Type in Swift, aber wir können sein allgemeines Verhalten durch wenige Hacks mit @noreturn Attribut und Generika wie in this talk erläutert.

func undefined<A>(_ message: String = "") -> A { 
    fatalError("Not Implemented: \(message)") 
} 

Dann können wir sie verwenden noch implementierter Teile unseres Codes zu markieren Compiler-Fehler passieren:

func someComplexFunction<U: User>(u: U) -> U { 
    return undefined("Do this after creating user") 
} 

Oder einige Invarianten in unserem Code zu beweisen:

let array = ["hello", "world"] 
let hello: String = array.first ?? undefined("This is impossible!")