当前位置: 首页 > 面试题库 >

为什么不应该直接扩展UIView或UIViewController?

岳枫
2023-03-14
问题内容

我看到了这个问题,使用以下代码:

protocol Flashable {}

extension Flashable where Self: UIView 
{
    func flash() {
        UIView.animate(withDuration: 0.3, delay: 0, options: .curveEaseIn, animations: {
            self.alpha = 1.0 //Object fades in
        }) { (animationComplete) in
            if animationComplete == true {
                UIView.animate(withDuration: 0.3, delay: 2.0, options: .curveEaseOut, animations: {
                    self.alpha = 0.0 //Object fades out
                    }, completion: nil)
            }
        }
    }
}

我想知道为什么我们不只是直接扩展UIView?或在类似情况下扩展UIViewController为什么要用where Self:

  • 这样做是为了增加我们的意图,当其他开发人员来访时,他们会看到此类符合Flashable,Dimable等标准吗?
  • 另外,我们的UIView会有单独的有意义的扩展吗?而不是UIView或UIViewController的其他未命名扩展?
  • 关于POP这个主题,苹果是否有任何具体的指导方针?我已经看到那里的开发人员以这种方式这样做,但不确定为什么…

问题答案:

这种方法优于UIView直接使用,例如

extension UIView {
    func flash() {
        ...
    }
}

因为它可以让程序员决定UIView他们想要创建哪些子类Flashable,而不是flash向所有ss都添加功能“批发” UIView

// This class has flashing functionality
class MyViewWithFlashing : UIView, Flashable {
    ...
}
// This class does not have flashing functionality
class MyView : UIView {
    ...
}

从本质上讲,这是一种“选择加入”方法,而另一种方法则强制执行功能而没有“选择退出”的方法



 类似资料:
  • 问题内容: 为什么接口不扩展接口?不是键值对的集合吗? 问题答案: 集合假定一个值的元素。映射假定键/值对的条目。他们本来可以重新使用相同的通用接口,但是它们实现的某些方法不兼容,例如 您可以将Map建模为条目的集合,这就是这样做的。 有一些共同的方法。,,,但这些都不太可能有多少价值作为一个独立的接口。(可以再次使用)

  • 问题内容: 输出: 但是当我执行以下操作时: 输出: 为什么扩展列表引用而不是列表扩展? 我发现这是因为我在尝试将listC扩展到listB时试图将listB附加到listA。 假设列表不能直接附加/扩展。解决该问题最常用的表格形式是什么? 问题答案: 修改到位列表,不返回任何内容,从而导致。在第二种情况下,这是一个正在扩展的临时列表,该列表在该行后立即消失,而在第一种情况下,可以通过引用。 在尝

  • 根据这些答案中的建议:对于laravel 4助手或基本功能,什么是最佳实践和最佳场所? 我已经创建了一个文件并将其添加到应用程序中。我的类应该扩展什么,如何在控制器中引用它? 我尝试在控制器中这样引用它: 但我得到控制器的方法没有找到。

  • 问题内容: 创建数组时,无法更改其大小;它是固定的。好的,看起来不错,我们可以创建一个新的更大的数组并逐个复制值,这有点慢。它的技术背景是什么? 问题答案: 这个问题没有提到语言,因此我将选择基于“ C”的数组作为答案。 数组被分配为单个内存块。增长数组是有问题的,因为正确执行此操作的唯一方法是在最后增长它。为了增加大小N,在数组的末尾必须在下一个分配的地址之前至少有N个空闲字节。 要支持这种类型

  • 问题内容: 事实并非如此,这让我感到惊讶。 我认为,如果这样声明,那将是很有意义的: 毕竟,是的集合,不是吗? 那么,为什么没有这样一个很好的实现呢? 感谢Cletus提供的最权威的答案,但是我仍然想知道为什么,如果你已经可以查看(通过),那么它不仅扩展了该接口。 如果a 是a ,则元素是什么?唯一合理的答案是“键值对” 确实会很棒! 但这提供了非常有限的(且不是特别有用的)Map抽象。 但是,如

  • 问题内容: 我想知道为什么在Java语言中a 不能扩展。 我不是在谈论一个延伸的(这不能做,因为Java没有多重继承,而Š隐含延长),但一类的以只添加额外的方法,而不是额外的枚举值。 就像是: 要这样使用: 因此,有人可以对此限制提供理由(或将我指向正确的JLS部分)吗? 问题答案: 我认为 他们这样做 的答案来自以下问题: 在您的示例中,如何实例化MyClass?用户永远不会(通过)显式实例化枚