我有以下 Swift 类:
class VideoFaceDetectionController: UIViewController, IPVideoEmbedderControlDelegate {
var videoPlayer: IPVideoEmbedderControl? // Note, not a weak reference
...
然后我在 Objective-C 中有一个方法(在引用的静态库中(:generatePlayer((,如下所示:
+ (IPVideoEmbedderControl*)generatePlayer
{
IPVideoEmbedderControl* control = [IPLoad
objectWithClass:[IPVideoEmbedderControl class]
fromBundle:[NSBundle bundleWithIdentifier:videoFrameworkBundleID]];
control.provider = [IPVideoPlaybackFactory getProvider];
[control createEmbeddingView];
return control;
}
我在 Swift 4 中这样称呼它:
videoPlayer? = IPVideoEmbedderControl.generatePlayer()
videoPlayer?.translatesAutoresizingMaskIntoConstraints = false;
现在我在第二行放了一个断点(翻译Auto...(,并检查videoPlayer。这是零。
现在我在控制台中执行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 值呢?
我使用的是Xcode Beta 9.0(第5版(,带有iPad Air 2(iOS 11(模拟器。 我现在无法在物理设备上进行验证,因为我还没有运行任何iOS 11。
如果此行不是拼写错误,并且您确实在应用程序中使用它,则它不会按预期工作:
videoPlayer? = IPVideoEmbedderControl.generatePlayer()
尝试将行更改为:
videoPlayer = IPVideoEmbedderControl.generatePlayer()
您知道下一行是一种可选链接。
videoPlayer?.translatesAutoresizingMaskIntoConstraints = false;
当videoPlayer
nil
时,该行的其余部分被安全地忽略,它什么也不做。
在第一行都一样:
videoPlayer? = IPVideoEmbedderControl.generatePlayer()
当videoPlayer
nil
时,该行的其余部分被安全地忽略,并且它什么也不做。