2017-08-18 3 views
0

でNILは、私は、次のスイフトクラスを持っているで:スイフト4:XCodeの9ベータ:静的ファクトリメソッドのObjective-Cは、デバッガで有効なオブジェクトを生成するが、コード

class VideoFaceDetectionController: UIViewController, IPVideoEmbedderControlDelegate { 

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

そしてIは、対物における方法を有します(参照静的ライブラリにおける)-C:generatePlayer()、次のように

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

    control.provider = [IPVideoPlaybackFactory getProvider]; 

    [control createEmbeddingView]; 
    return control; 
} 

私のようなので、スイフト4でそれを呼び出す:

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

今私は2番目の行(translatesAuto ....)にブレークポイントを置き、videoPlayerを検査します。 それはNILです。

は、今私は、コンソールにPO IPVideoEmbedderControl.generatePlayer()を行い、それは偶数フレームがあること、有効なインスタンスを生成します。それでは、どのようそれはそれは、デバッガにすることができ

(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>>" 

を有効なオブジェクトが生成されて返されますが、コードでは同じ正確なメソッドからNIL値が返されますか?

iPad Air 2(iOS 11)シミュレータでXcode Beta 9.0(Release 5)を使用しています。現在iOS 11は稼働していないため、物理デバイスを確認することはできません。

答えて

1

このラインはタイプミスではなく、あなたが本当にあなたのアプリケーションでそれを使用する場合、それはあなたが期待するように動作しません:

videoPlayer = IPVideoEmbedderControl.generatePlayer() 

videoPlayer? = IPVideoEmbedderControl.generatePlayer() 

のような行を変更してみてください

あなたは、次の行が一種のオプションの連鎖であることを知っています。 videoPlayernilとき

videoPlayer?.translatesAutoresizingMaskIntoConstraints = false; 

、行の残りは無視され、それは何もしません。

最初の行のすべての同じは:

videoPlayer? = IPVideoEmbedderControl.generatePlayer() 

videoPlayernilで、行の残りは無視され、それは何もしません。

+0

それはありがとうございました。コード内で多くの割り当てを行うと思うには、疑問符をどこにでも置くことができ、警告なしで無言のno-opを得ることができます。私は彼らがこれを防ぐべきだと思う。彼らは型の安全性と明示的性を高めようとしていますが、これはObjective-Cのnilインスタンスに対するサイレントノーオペレーションと同等です。初心者ミス。ありがとう。 – Alex

+0

@Alex、いくつかの警告があるはずです。私はあなたがこのような間違いを犯す唯一の人だとは思わない。 (なぜこの回答をすぐに書くことができるか推測します...)[swift.orgにバグレポートを書く](https://bugs.swift.org/)。 – OOPer

関連する問題