2016-10-28 3 views
1

Ich arbeite mit etwas dazu bagatellisiert:Wie überprüfe ich korrekt auf einen erfolgreichen Downcast zu AnyObject?

func isAnyObject<T>(someObject: T) { 
    if let object = someObject as? AnyObject { 
     // do something 
    } else { 
     // do something else 
    } 
} 

die mir die Compiler-Warnungen gibt:

  1. Bedingte Umwandlung von 'T' auf 'ANYOBJECT' immer
  2. Nicht optional erfolgreich Ausdruck des Typs 'AnyObject' in einer Prüfung für Optionale

Ich verstehe, warum die Besetzung immer gelingt, aber ich weiß nicht, was ich tun soll, um es zu reparieren. Ich habe versucht, Zeile 2 zu if let object = foo as AnyObject? ändern, aber wenn ich eine Struktur durch die Funktion übergeben, wird es immer noch in den 'Wenn' Block. Was fehlt mir hier?

+0

Warum gießt du überhaupt? – Alexander

+0

P.s., schreiben Sie nicht '-> Void' in Funktionssignaturen. – Alexander

+0

Hoppla. Ich weiß nicht, ob ich den Zweck der Besetzung vollständig verstehe, aber für meine eigenen Absichten sehe ich nur, was es braucht, damit ein Strukturobjekt übergeben wird und dass es den Block "sonst" trifft. – Steals

Antwort

0

Eigentlich kann ich die Fehler, die Sie ausstellen, nicht neu erstellen. Der Compiler klagen jedoch über die offensichtlichen Fehler im Parameter der Funktion.

import Foundation 

func isAnyObject<T>(_ someObject: T) { 
    if let object = someObject as? AnyObject { 
     print("It's an AnyObject: \(object)") 
    } else { 
     print("It's not an AnyObject.") 
    } 
} 

let classObject: NSString = "This is an NSString Object" 
let structInstance: String = "This is a Swift String Instance" 

isAnyObject(classObject) // It's an AnyObject: This is an NSString Object 
isAnyObject(structInstance) // It's not an AnyObject. 

You can try it online, here.

+0

ah Entschuldigung. Beim Versuch, mein Code-Snippet zu trivialisieren, habe ich viele Tippfehler eingeführt. Obwohl ich keine Warnungen durch die Sandbox erhalten habe, bekomme ich durch das Einstecken des gleichen Codes in Playground oder XCode immer noch dieselben zwei Warnungen, die ich oben aufgelistet habe. – Steals

+0

Interessant, ich bekomme die Warnungen auch in Xcode. Dieses Verhalten ist wahrscheinlich ein Nebeneffekt für das automatische Boxing, das Swift für Strukturtypen vornimmt. – Alexander

0

können Sie überprüfen, ob der Typ der Variablen ANYOBJECT ist. Wenn ja, ist es ein Referenztyp. Wenn nicht, ist es ein Werttyp. Ich bekomme auch eine Warnung auf dem Spielplatz, aber die Warnung ist falsch. Der folgende Code erzeugt falsch, falsch, falsch, falsch, wahr, so dass die Funktion eindeutig funktioniert und der Test nicht immer wahr ist, wie die Warnung sagt. Dies ist ein Fehler.

func isReferenceType<T>(someObject: T) -> Bool { 
     return type(of: someObject) is AnyObject 
    } 

    //Values 
    print(isReferenceType(someObject: "a")) 
    print(isReferenceType(someObject: 1)) 
    print(isReferenceType(someObject: Int?(0))) 
    print(isReferenceType(someObject: {print("1")})) 
    //Reference 
    print(isReferenceType(someObject: UIView())) 
+0

Danke. Das war es, was mich zu einer Schleife brachte. Ich hatte den Eindruck, dass ein Struct nicht in AnyObject umgewandelt werden kann, aber als ich eine Struktur erstellt habe, habe ich Folgendes versucht: 'SomeStruct() ist AnyObject', es wurde True zurückgegeben. Irgendeine Idee warum das der Fall ist? – Steals

+0

Sie können einfach 'someObject ist AnyObject' schreiben, ohne' type (of:) ' – Alexander

+0

Außerdem frage ich mich, ob es ein Problem gibt, das ich mit dieser Zeile geschrieben habe: if let object = someObject as? AnyObject', denn selbst wenn ich mein 'isAnyObject' mit einer UIView teste, komme ich immer noch in die 'if' Anweisung – Steals

Verwandte Themen