我创建了NSView个类,所有这些类都支持一个特殊的操作,我们称之为transmogrify.乍一看,这里似乎是制定协议的最佳场所:

protocol TransmogrifiableView {
    func transmogrify()
}

然而,该协议并不强制notTransmogrifiableView个也必须是NSView.这意味着我在TransmogrifiableView上调用的任何NSView个方法都不会进行类型判断:

let myView: TransmogrifiableView = getTransmogrifiableView()
let theSuperView = myView.superView // error: TransmogrifiableView does not have a property called 'superview'

我不知道如何要求实现我的协议的所有类也是NSView的子类.我试过这个:

protocol TransmogrifiableView: NSView {
    func transmogrify()
}

但Swift 抱怨说,协议不能从类继承.使用

protocol TransmogrifiableView: class, NSView {
    func transmogrify()
}

I cannot make 100 a superclass rather than a protocol, because some of my 100 classes must be subclasses of other, non-transmogrifiable views.

我该如何要求所有的TransmogrifiableView也都是NSView?我真的不想在我的代码中添加"as"转换,这是一种糟糕的形式,会让人分心.

推荐答案

我想你在追求一个NSView人的亚类.试试这个:

protocol TransmogrifiableView {
    func transmogrify()
}

class MyNSView: NSView, TransmogrifiableView {
    // do stuff.
}

在后面的代码中,接受类型为MyNSView的对象.

编辑

你可能想要Extension,见this

extension NSView: TransmogrifiableView {
    // implementation of protocol requirements goes here
}
  • 请注意,如果没有这个额外的方法,您将无法获得NSView.
  • 您可以单独扩展NSView的子类来覆盖这个新方法.

还有一种 Select 是创建一个类,该类包含指向NSView的指针,并实现其他方法.这还将迫使您从NSView代理all个您想要使用的方法.

class NSViewWrapper: TransmogrifiableView {
    var view : NSView!
    // init with the view required.
    //  implementation of protocol requirements goes here.
    .....
   // proxy all methods from NSView.
   func getSuperView(){
       return self.view.superView
   }
}

这是相当长,不好,但会工作.我建议您只有在确实无法使用扩展时才使用它(因为您需要没有额外方法的NSView).

Swift相关问答推荐

操作员如何点逻辑非(.!)在Swift工作?

如何在一个角色隔离类上编写自定义==实现?

查找数组中 ** 元素 ** 的属性的最小值和最大值

在NavigationStack上设置拐角半径:SwiftUI中的无响应内容视图区

SwiftUI 无法在实时活动中显示 SpriteView

列表不显示信息

如何从我的 macOS 应用程序打开 (.log) 文件?

Swiftui 无法从核心数据中获取数据

我如何读取并通知可可 macos 中某个类的计算(computed)属性?

Swift 包管理器 Package.resolved 文件末尾的版本是什么意思?

如何在填充上添加 if else 语句? SwiftUI

临时添加到视图层次 struct 后,Weak view引用不会被释放

swift 如何从 Int 转换?到字符串

在 Swift 中计算两个日期之间的差异

如何为多个类 Swift 进行扩展

使用 Swift 在 iOS 8 中为应用程序图标添加徽章

Swift 3:小数到 Int

为 UIImagePicker 设置委托返回错误

SwiftUI:将多个 BindableObjects 放入环境

NSLocationWhenInUseUsageDescription 警告,但我已经添加了