在SWIFT中,我可以通过如下声明显式设置变量的类型:

var object: TYPE_NAME

如果我们想更进一步,声明一个符合多个协议的变量,我们可以使用protocol声明性:

var object: protocol<ProtocolOne,ProtocolTwo>//etc

如果我想声明一个符合一个或多个协议并且也是特定基类类型的对象,该怎么办?Objective-C类似功能如下所示:

NSSomething<ABCProtocolOne,ABCProtocolTwo> * object = ...;

在SWIFT中,我预计它会是这样的:

var object: TYPE_NAME,ProtocolOne//etc

这使我们能够灵活地处理基本类型的实现以及协议中定义的添加接口.

有没有其他更明显的方式让我失踪?

示例

例如,假设我有一个UITableViewCell工厂,负责返回符合协议的单元.我们可以很容易地设置返回符合协议的单元格的通用函数:

class CellFactory {
    class func createCellForItem<T: UITableViewCell where T:MyProtocol >(item: SpecialItem,tableView: UITableView) -> T {
        //etc
    }
}

稍后,我想将这些信元出列,同时利用类型和协议

var cell: MyProtocol = CellFactory.createCellForItem(somethingAtIndexPath) as UITableViewCell

这将返回错误,因为表格视图单元格不符合协议.

我希望能够指定单元格是UITableViewCell,并且符合变量声明中的MyProtocol

对齐

如果您熟悉Factory Pattern,那么在能够返回实现特定接口的特定类的对象的上下文中,这是有意义的.

就像在我的示例中一样,有时我们喜欢定义在应用于特定对象时有意义的接口.我的表视图单元格示例就是这样一个理由.

虽然提供的类型不完全符合上述接口,但工厂返回的对象符合,因此我希望能够灵活地与基类类型和声明的协议接口进行交互

推荐答案

在Swift 4中,现在可以声明一个变量,该变量是一个类型的子类,并同时实现一个或多个协议.

var myVariable: MyClass & MyProtocol & MySecondProtocol

要执行可选变量,请执行以下操作:

var myVariable: (MyClass & MyProtocol & MySecondProtocol)?

或者作为方法的参数:

func shakeEm(controls: [UIControl & Shakeable]) {}

苹果于2017年在WWDC上宣布了这一点

第二,我想谈谈如何组合类和协议.所以,这里

Ios相关问答推荐

在Android和iOS上从后台恢复应用程序后,inappwebview上出现白屏?

SwiftData在获取值时应用程序崩溃:线程1:EXC_BREAKPOINT(代码=1,子代码=0x101e8303c)

带有故事板的Xcode 15 UIKit视图可以与#Preview宏一起使用吗?

如何在expo-react native中从ios平台中排除包

无法向委托发送数据

长按 SwiftUI 更改项目的顺序

过渡动画在 iOS16 中不起作用,但在 iOS15 中起作用

如何包含 Xcode 子项目标头?

Swiftui为什么在点击第二行之前背景不起作用

在所有 tableview / collectionview 中禁用滚动指示器

UIButton在iOS7中没有显示突出显示

ARKit vs. ARCore vs. Vuforia vs. D'Fusion Mobile vs. Layar SDK

Xcode 缺少支持文件 iOS 12.2 (16E227)

在 iOS 8.1 模拟器上更改语言不起作用

如何找出用于构建 *.ipa 文件的配置文件?

iOS中的apk类似功能是什么?

如果已安装,则重定向到应用程序,否则重定向到 App Store

AFNetworking 2.0 向 GET 请求添加标头

如何在ios中生成UUID

如何立即移动 CALayer(无动画)