类和协议的 Swift 类型别名

Posted

技术标签:

【中文标题】类和协议的 Swift 类型别名【英文标题】:Swift Typealias for Class and Protocol 【发布时间】:2017-08-06 02:52:57 【问题描述】:

我有一个变量必须是UIView,它也实现了协议MTMathKeyboard

我试过了,

var keyboard: (UIView & MTMathKeyboard)
var keyboard: UIView<MTMathKeyboard>

实现协议的非泛型类实例的语法是什么?

【问题讨论】:

我认为 Swift 中还没有简单的解决方案。查看这篇博文:chris.eidhof.nl/post/classes-and-protocols 相关(重复?)***.com/questions/25623761/… 也相关:***.com/q/42090028/2976878 【参考方案1】:

我认为你应该走这条路:

protocol MTMathKeyboard: class 



class YourClass<MTMathKeyboard where T:UIView> 
    var keyboard: T!

【讨论】:

【参考方案2】:

您可以使用协议组合并扩展 UIView 以满足占位符协议:

protocol UIViewClass 
extension UIView:UIViewClass 


var keyboard :  UIViewClass & MTMathKeyboard

【讨论】:

【参考方案3】:

在 Swift 4 中,您可以使用:

let keyboard: UIView & MTMathKeyboard

【讨论】:

很有帮助,这个功能叫什么名字?我一直在寻找文档。【参考方案4】:
typealias KeyboardView = UIView & MTMathKeyboard

protocol MTMathKeyboard: class 


private func updateController(with view: KeyboardView) 
        someView = view

【讨论】:

一个很好的例子说明为什么坚持代码格式化指南是有帮助的:someView = keyboard 这里一个名为 keyboard 的对象不存在,但它是一个类型名称。

以上是关于类和协议的 Swift 类型别名的主要内容,如果未能解决你的问题,请参考以下文章

Swift中结构体和类的区别

swift protocol(协议) associatedtype关联类型

Swift 协议中的弱属性只能是类或类绑定协议类型

Swift 中的类和协议继承

swift-associatedtype关键字

Swift - 具有实现通用协议的值的 Typealias 字典