我正在尝试扩展用Obj-C编写的类,并包含一个用Swift编写的扩展,使其符合UIDropInteractionDelegate
,如下所示:
@available(iOS 11.0, *)
extension NoteEditViewController: UIDropInteractionDelegate {
@available(iOS 11.0, *)
public func dropInteraction(_ interaction: UIDropInteraction, sessionDidUpdate session: UIDropSession) -> UIDropProposal {
let operation: UIDropOperation
if session.localDragSession == nil {
operation = .forbidden
} else {
// If a local drag session exists, we only want to move an
// existing item in the pin board to a different location.
operation = .forbidden
}
return UIDropProposal(operation: operation)
}
@objc(setupDropInteractions)
@available(iOS 11.0, *)
func setupDropInteractions() {
// Add drop interaction
self.view.addInteraction(UIDropInteraction(delegate: self))
}
}
我的问题是Project_Name-Swift.h
文件包含以下不能编译的代码:
@class UIDropInteraction;
@protocol UIDropSession;
@class UIDropProposal;
// This line is causing the issue saying "'UIDropInteractionDelegate' is partial: introduced in iOS 11.0"
@interface NoteEditViewController (SWIFT_EXTENSION(Bloomberg_Professional)) <UIDropInteractionDelegate>
- (UIDropProposal * _Nonnull)dropInteraction:(UIDropInteraction * _Nonnull)interaction sessionDidUpdate:(id <UIDropSession> _Nonnull)session SWIFT_WARN_UNUSED_RESULT SWIFT_AVAILABILITY(ios,introduced=11.0);
- (void)setupDropInteractions SWIFT_AVAILABILITY(ios,introduced=11.0);
@end
编译器抱怨该文件中的接口是部分的。
&#39; UIDropInteractionDelegate&#39;是部分:在iOS 11.0中引入
我认为包含@available(iOS 11.0, *)
会生成一个SWIFT_AVAILABILITY(ios,introduced=11.0)
来封装整个界面,但我错了。
有没有办法解决这个问题?
更新
我实施了一个玩具示例。
这是玩具ViewController:
这是快速扩展:
这是生成的dnd_toy-Swift.h文件。
你是对的,它只是一个警告,但我的问题是我们必须将所有警告视为项目中的错误。
有关如何摆脱此警告的任何想法吗?
答案 0 :(得分:8)
在ObjC中,将API_AVAILABLE(ios(11.0))
添加到函数定义的末尾将禁止警告。像这样:
- (nullable UISwipeActionsConfiguration *)tableView:(UITableView *)tableView leadingSwipeActionsConfigurationForRowAtIndexPath:(NSIndexPath *)indexPath API_AVAILABLE(ios(11.0))
{
... function implementation ...
}
答案 1 :(得分:7)
您已正确完成所有操作,并且即使不是非常迟钝,投诉也是准确的。
基本上,由于您已经(正确地)将该功能标记为iOS 11中提供的功能,因此编译器会警告您在任何针对某些内容的代码中使用该功能&lt; iOS 11。
因此,您可以通过将部署目标设置为iOS 11来消除投诉,这意味着iOS 10的用户根本不会被允许安装它。或者,您可以使用新的(to obj-c)@available
构造来防止使用API。
if (@available(iOS 11, *)) {
[self setupDropInteractions];
}
Xcode 8不支持此构造,因为它是Swift提供的#available构造的最新后端。
我澄清了我来自哪里。我似乎无法重现提问者正在经历的情况,因此我展示了我能够做到的事情。
我可以生成2个不同的编译器警告,它们相似但似乎与原始问题不同。
这是我从my_project-Swift.h
生成的objc界面:
@interface NoteEditViewController (SWIFT_EXTENSION(conditional_class_declaration)) <UIDropInteractionDelegate>
- (UIDropProposal * _Nonnull)dropInteraction:(UIDropInteraction * _Nonnull)interaction sessionDidUpdate:(id <UIDropSession> _Nonnull)session SWIFT_WARN_UNUSED_RESULT SWIFT_AVAILABILITY(ios,introduced=11.0);
- (void)setupDropInteractions SWIFT_AVAILABILITY(ios,introduced=11.0);
@end
有了更多信息来重现编译错误,我将能够提供更多帮助。
我发现我们之间的行为差异是因为我的项目是使用Xcode 8.3创建的,然后迁移到9.在这些事情发生后,构建设置似乎有所不同。有问题的设置是CLANG_WARN_UNGUARDED_AVAILABILITY
,我认为这是Xcode 9的新功能。
WWDC2017 - What's new in LLVM中讨论了此设置,但他们所说的并不表示这种轻微的行为差异。我猜这是一个铿锵的错误,以及它如何处理两个设置之间的差异(但我欢迎其他输入)。我确信你已经知道了,这个代码在iOS 10上运行正常。另外,如果你将设置改为简单的&#34;是&#34;,你仍会得到关于iOS的正确警告11个API。
答案 2 :(得分:4)
如果将@available添加到每个方法,将构建Xcode 9 beta 4。如果仅在扩展级别添加@available,则构建仍会失败。