我只是使用Xcode 8的convert函数将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


我该如何解决这个问题?

最佳答案

由于委托方法sessionDidDeactivatesessionDidBecomeInactive在watchOS上标记为不可用,因此您必须使编译器忽略共享类中的那些代码。您可以使用以下预处理器宏进行此操作:

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


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

08-04 13:59