9

我刚刚使用 Xcode 8 的转换功能将 Swift 2 应用程序转换为 Swift 3。

我的代码有一个标记为WCSessionDelegate.

在 Swift 2 中,它编译时没有使用方法sessionDidBecomeInactivesessionDidDeactivate.

如果我编译 Swift 3 版本,编译器会抱怨我的类不符合协议WCSessionDelegate,这显然是正确的。
然后它提供为这两个功能插入存根:

public func sessionDidBecomeInactive(_ session: WCSession) { }  
public func sessionDidDeactivate(_ session: WCSession) { }

插入这些存根后,会报告这些错误:

Cannot override 'sessionDidBecomeInactive' which has been marked unavailable  
Cannot override 'sessionDidDeactivate' which has been marked unavailable  

我该如何解决这个问题?

4

1 回答 1

36

因为委托方法在 watchOSsessionDidDeactivatesessionDidBecomeInactive被标记为不可用,所以您必须让编译器忽略共享类中的这些代码。您可以使用以下预处理器宏执行此操作:

#if os(iOS)
public func sessionDidBecomeInactive(_ session: WCSession) { }  
public func sessionDidDeactivate(_ session: WCSession) {
    session.activate()
}
#endif

另请注意,我在activate通话中添加了sessionDidDeactivate通话。这是为了在用户从一只配对手表切换到第二只配对手表时重新激活手机上的会话。像这样调用它假定您没有其他线程/部分代码需要在切换发生之前给予时间。有关支持快速手表切换的更多信息,您应该查看 Apple示例代码

于 2016-09-19T16:53:52.800 回答