【问题标题】:Swift Protocol conform to two specific classes onlySwift 协议只符合两个特定的类
【发布时间】:2019-03-31 15:33:08
【问题描述】:

我想做一个只能被 UIlabels 和 UIButton 遵守的协议,有没有办法?

例子:

protocol MyProtocol {
    func setTextValue()
}

我希望 MyProtocol 只能被 UILabel 和 UIButton 访问,而没有其他类

【问题讨论】:

  • 正如 matt 所指出的,目前不可能(在 Swift 的类型约束中没有“或”的构造),但我很好奇你想用这个实现什么。感觉几乎可以肯定,重载或完整类型(很可能是结构或最终类)会更好地为您服务。如果你能做到这一点,你会写什么代码来使用它?
  • 我想在这两个类中设置一个值,并根据该值设置一些常见属性,例如标题、文本颜色等。
  • @EkjotKaur 所以你问了一个 x-y 问题。如果那是你的目标,你应该问这个问题,而不是假设一个解决方案并询问该解决方案是否可行。
  • 是的,这听起来是一个非常简单的问题。只需制作一个涵盖您想要的东西(标题,文本颜色等)的协议,并符合您想要的类。您为什么要尝试禁止其他类型符合您的协议?
  • @matt,我知道有很多方法可以实现我想要的。但我想知道这是否可以通过协议来实现(正如我的问题“有没有办法”中提到的那样)。

标签: ios swift protocols


【解决方案1】:

我想做一个只能被 UIlabels 和 UIButton 遵守的协议,有没有办法?

只能是哪一个?不直接,不。您不能将合同强加给其他程序员,以使程序员无法让其他一些类采用您的协议(例如,如果发生这种情况,则强制编译器抱怨)。

但也许你的意思是只是“符合”(即采用)。在那种情况下,当然。没有什么能阻止声明一个协议,然后你自己声明UILabel和UIButton采用它(并且不声明任何其他类采用它它)。做吧。

【讨论】:

  • 你能分享一个例子吗?
  • 举个例子?你仍然没有准确地展示你想要做什么。你问了一个笼统的“这可能吗”的问题,而我已经准确地回答了这个问题。如果你有一个协议,你可以说extension UIButton : MyProtocolextension UILabel : MyProtocol,然后UIButton和UILabel已经采用了它(如果你的代码继续满足协议要求)。
  • 但是这个协议可以被 UIView 访问,我不想要它。正如我的问题中提到的,我只想要两个特定的类来访问它
  • “被 UIView 访问”是什么意思?如果您不想要它,请不要使 UIView 符合协议。你所要求的在 Swift 中是不可能的(但我们也相信它在 Swift 中并不是特别有价值;我们试图理解你为什么认为它很有价值,因为你可能是对的,并且可能值得开设一个 SE关于)。
  • “但是这个协议可以被 UIView 访问”不它不能!你没有让 UIView 采用它。
【解决方案2】:

扩展程序可能是更好的套件,尤其是在 swift 中,具体取决于您想要做什么。

extension UILabel {
    func greenBackground() {
        self.backgroundColor = .green
    }
}

然后你可以在你的项目中的任何地方使用它,就像这样:

let label = UILabel()
label.greenBackground()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-05
    • 1970-01-01
    相关资源
    最近更新 更多