2017-08-18 1 views
0

Ich habe folgende Swift Klasse:Swift 4: XCode 9 Beta: Statische Factory-Methode in Objective-C erzeugt ein gültiges Objekt in Debugger, aber NIL im Code

class VideoFaceDetectionController: UIViewController, IPVideoEmbedderControlDelegate { 

var videoPlayer: IPVideoEmbedderControl? // Note, not a weak reference 
... 

Dann habe ich eine Methode in Objective -C (in einer referenzierten statischen Bibliothek): generatePlayer(), wie folgt:

+ (IPVideoEmbedderControl*)generatePlayer 
{ 
    IPVideoEmbedderControl* control = [IPLoad 
     objectWithClass:[IPVideoEmbedderControl class] 
     fromBundle:[NSBundle bundleWithIdentifier:videoFrameworkBundleID]]; 

    control.provider = [IPVideoPlaybackFactory getProvider]; 

    [control createEmbeddingView]; 
    return control; 
} 

ich es in Swift Anruf 4 wie folgt:

videoPlayer? = IPVideoEmbedderControl.generatePlayer() 
videoPlayer?.translatesAutoresizingMaskIntoConstraints = false; 

Jetzt setze ich einen Breakpoint in die zweite Zeile (translateAuto ....) und inspire videoPlayer. Es ist NIL.

Jetzt mache ich po IPVideoEmbedderControl.generatePlayer() in der Konsole, und das erzeugt eine gültige Instanz, dass auch einen Rahmen:

(lldb) po IPVideoEmbedderControl.generatePlayer() 
▿ Optional<IPVideoEmbedderControl> 

(lldb) po IPVideoEmbedderControl.generatePlayer().description 
"<IPVideoEmbedderControl: 0x7faf88c19390; baseClass = UIControl; frame = (0 0; 320 349); autoresize = W+H; layer = <CALayer: 0x60c0002265c0>>" 

So wie es, dass in dem Debugger sein kann , ein gültiges Objekt wird erzeugt und zurückgegeben, aber im Code wird ein NIL-Wert von genau derselben Methode zurückgegeben?

Ich benutze Xcode Beta 9.0 (Release 5), mit einem iPad Air 2 (iOS 11) Simulator. Ich kann im Moment keine physischen Geräte überprüfen, da ich noch kein iOS 11 habe.

Antwort

1

Wenn diese Zeile nicht ein Tippfehler ist und Sie es wirklich in Ihrer Anwendung verwenden, funktioniert es nicht wie erwartet:

videoPlayer? = IPVideoEmbedderControl.generatePlayer() 

Versuchen Sie, die Linie zu ändern:

videoPlayer = IPVideoEmbedderControl.generatePlayer() 

Sie wissen, dass die nächste Zeile eine Art optionale Verkettung ist.

videoPlayer?.translatesAutoresizingMaskIntoConstraints = false; 

Wenn videoPlayernil ist, wird der Rest der Zeile sicher ignoriert und es tut nichts.

alle gleich in der ersten Zeile:

videoPlayer? = IPVideoEmbedderControl.generatePlayer() 

Wenn videoPlayernil ist, wird der Rest der Zeile sicher ignoriert und es tut nichts.

+0

Das war es, danke. Um zu denken, dass Sie so viel Aufgaben in Ihrem Code ausführen, können Sie einfach ein Fragezeichen irgendwo setzen, und Sie erhalten stummes No-Op ohne jede Warnung. Ich denke, das sollten sie verhindern. Sie versuchen, typsicherer und expliziter zu sein, aber das ist das Äquivalent von Silent No-Op auf Null-Instanzen in Objective-C. Anfänger Fehler. Vielen Dank. – Alex

+0

@Alex, Ich stimme zu, dass es einige Warnungen geben sollte. Ich glaube nicht, dass du der einzige bist, der einen Fehler macht. (Raten Sie, warum ich diese Antwort so bald schreiben könnte ...) Sie können einen [Fehlerbericht an swift.org] schreiben (https://bugs.swift.org/). – OOPer

Verwandte Themen