首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Swift属性中要求协议和类

在Swift属性中要求协议和类
EN

Stack Overflow用户
提问于 2014-07-21 06:43:31
回答 5查看 2K关注 0票数 17

在Objective中,您可以为属性要求一个类和附加协议实现:

代码语言:javascript
复制
@property (nonatomic) UIViewController<UISplitViewDelegate> *viewController;

这在斯威夫特有可能吗?从文档看,您只需要一个类或一个协议。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2017-06-06 22:56:35

在Swift 4中,您可以这样做:

代码语言:javascript
复制
let viewController: UIViewController & UISplitViewDelegate
票数 3
EN

Stack Overflow用户

发布于 2015-01-07 19:36:54

实际上,在Swift中有两种方法可以实现这一点:

  1. 使用空的“幻影”协议。创建一个空协议并使UIViewController符合它。这是最"Swift“的方法,它是安全的,它是动态的(不需要在编译时指定类)。 协议_UIViewControllerType {}扩展UIViewController:_UIViewControllerType {} class MyClass {弱var viewController: protocol?} 您还可以为这种类型声明一个typealias (只是为了减少代码混乱)。 类MyClass { ViewControllerType = protocol弱变量viewController: ViewControllerType?}
  2. 使用泛型约束。正如fnc12康斯坦丁·科瓦尔所提到的。这是安全的,但不允许您在运行时“交换”视图控制器实例。 类MyClass {弱变量viewController: T?}

我希望下一个Swift版本添加了一种方法来指定这两个约束,而不用使用“幻影协议”.

代码语言:javascript
复制
typealias ViewControllerType = UIViewController: UISplitViewControllerDelegate // wish
票数 16
EN

Stack Overflow用户

发布于 2014-07-21 07:48:21

是的,你能做到的

代码语言:javascript
复制
class A < T : SomeClass where T: Comparable> {
    var myProperty: T
    init(t :T) {
        myProperty = t
    }
}

声明具有T类型属性的类ASomeClass或子类,并且必须采用Comparable协议

在声明属性时,可以使用协议作为类型。

代码语言:javascript
复制
class MyClass {
    var nsobject: NSObjectProtocol
    init(object : NSObjectProtocol) {
        nsobject = object
    }
}

// Pure Swift
protocol RandomNumberGenerator {
}

class Dice {
    let generator: RandomNumberGenerator
    //specify many protocols
    let printer: protocol<Printable, NicePrintable> 
}

你可以读这里的文件

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24859053

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档