Dieser Codeabschnitt funktioniert wie erwartet. "integer is int" wird in Ausgabe ausgegeben.Swift "ist" -Operator mit Typ in Variable gespeichert
let integer = Int()
if integer is Int {
println("integer is int")
}
else {
println("integer is not int")
}
Ich mag is
Betreiber in der gleichen Art und Weise verwenden, wie ich isKindOfClass
Methode verwenden kann - mit Klasse (oder eher Typ) in Variablen gespeichert. Es würde wie folgt aussehen:
let integer = Int()
let intType : Any = Int.self
if integer is intType {
println("Integer is int")
}
else {
println("Integer is not int")
}
Leider dies zu einem Fehler: Use of undeclared type 'IntType'
.
IntType
in if
Zustand hat auch eine andere Farbe (wenn Sie es zum Spielplatz Paste) als an anderen Orten im Quellcode, was darauf hindeutet, dass (wie die Fehlermeldung sagt) sein als Klassenname behandelt wird (wie IntType
wären eine Klasse). Aber es ist nicht. Es bedeutet, dass is
Operator nicht mit Variablen auf der rechten Seite verwendet werden kann?
Ich möchte is
Operator verwenden, weil es nicht nur Klassen, sondern auch andere Arten vergleichen kann.
Wie kann ich prüfen, ob der Wert den Typ hat, den ich erwarte?
fand ich schmutzige Lösung, aber es ist wirklich weit davon entfernt zuverlässig zu sein ...
let integer = Int()
let intType : Any = Int.self
func ==(left: Any, right: Any) -> Bool {
let leftString = "\(left)"
let rightString = "\(right)"
return leftString == rightString
}
if (integer.dynamicType as Any) == intType {
println("true")
}
else {
println("false")
}
funktioniert perfekt, aber vorsichtig sein - dazu führen, dies ist auch wahr:
if (integer.dynamicType as Any) == ("Swift.Int" as Any) {
println("true")
}
else {
println("false")
}
Gibt es einen besseren Weg?
Ok, ich werde weiter erklären, was ich erreichen möchte. Ich habe ein Objekt, das Instanzen von generischen Klasseninstanzen verwaltet. Irgendwann muss ich eine dieser generischen Klasseninstanzen auswählen, die auf dem generischen Typ basieren. Beispiel:
class GenericClass<T> {}
struct ToolInfo {
let tool : AnyObject
let jobType : Any
}
class Manager {
var tools = Array<ToolInfo>()
func pickToolForTheJob(job : Any) -> AnyObject {
return tools.magicMethodWhichReturnProperTool()
}
}
let viewTool = GenericClass<UIView>()
let rectangleTool = GenericClass<CGRect>()
let manager = Manager()
manager.tools.append(ToolInfo(tool: viewTool, jobType: UIView.self))
manager.tools.append(ToolInfo(tool: rectangleTool, jobType: CGRect.self))
manager.pickToolForTheJob(UIView()) // i want to get viewTool here
manager.pickToolForTheJob(CGRect()) // i want to get rectangleTool here
Zur Zeit habe ich ToolInfo
Struktur, denn soweit ich weiß nicht, seine mögliche Art in <>
weitergegeben zu bekommen, während generische Klasse Objekt zu erhalten. Aber ich kann es immer noch nicht vergleichen.
dachte auch über die Implementierung === Operator, aber es löst es nicht elegant.ein weiterer Gedanke, es in eine 'struct' zu integrieren, wie es Optionals tun, aber ich weiß nicht, ob es für dich akzeptabel ist. – rshev
Nicht sicher, warum Sie Klasse in eine Variable speichern müssen, aber ich denke, dass Typalias für diese Dinge gemacht werden –
Jungs Ich habe Frage aktualisiert, um mein Problem zu zeigen, vielleicht einige von Ihnen schlagen andere Wege vor, um dieses Problem zu lösen. @rshev wie würde es aussehen? Kannst du es bitte weiter erklären (mit einer Struktur) oder ein Pseudocode-Beispiel zeigen? – luleq