ios - 协议(protocol)扩展似乎没有在消费者中强制执行变量?

标签 ios swift protocols

说你

protocol Able: class {
    var v:UIView? { get set }
    var x:CGFloat { get set }
}

当然,当你使用 Able 时,

enter image description here

如果您忘记了“v”或“x”...

这是一个错误。那很好。

那么这样做:

class ScreenThing: UIViewController, Able {
    @IBOutlet var v: UIView?
    var x: CGFloat = 0.0
}

一切顺利。太好了。

强制指定“v”和“x”并实际初始化它们。

但是。试试这个...

var _H: UInt8 = 0

protocol Able: class {
}

extension Able where Self:UIViewController {

    var p:P {
    get {
        return objc_getAssociatedObject(self, &_H) as! P
        }
    set {
        objc_setAssociatedObject(self, &_H, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
        __setter()
        }
    }
}

Able 现在有一个属性 p。

您可以在 Able 的函数或 ScreenThing 的函数中完美地使用 p。太好了。

然而……

当你这样做的时候......

class ScreenThing: UIViewController, Able {
}

不会收到错误。

您可能会忘记初始化“p”(它会崩溃)。

事实上,您不必将“p”指定为变量(因为您必须指定“v”和“x”)。

为什么会这样?

这似乎是个大问题。

我是否需要做一些不同的事情来让编译器强制执行“p”,就像它通常强制执行协议(protocol)中的变量一样?


看这个问题的另一种方式:

完全按照我上面的代码:

有没有办法强制编译器需要消费者类中“p”的初始值设定项?

例如。

我试过了...

class ScreenThing: UIViewController, Able {
    var p:P
}

但这行不通。

(奇怪的是,编译 - 实际上我不知道它到底在做什么!它似乎是一个与扩展中的 p 不同的 p。但无论如何它不强制执行需要一个初始化程序。)

简而言之,上面有什么我可以做或添加的,这会让编译器强制我初始化伪属性的东西,就像我在协议(protocol)中放置一个属性时它通常会做的那样作为“x”或“v”。

?

  • 也许我必须在协议(protocol)中添加一些普通属性(如“pp”),并以某种方式使 p 与它相关?只是一个想法。

(脚注 -- 请参阅 this 以了解上述协议(protocol)中所需的“: 类”。)


回答我自己的问题:

我上面的困惑是没有什么可以初始化var p:P 在扩展中(带有 get 和 set 代码块)只是两个函数。

没有什么要初始化的。

例如:在我的额外问题中,我问“如何强制符合类在唤醒时对其进行初始化?”那是没有意义的。如果有的话,人们可能会问:“如何强制符合类确保在唤醒时‘使用那些功能’?” - 这与初始化无关。

另请注意,我在计算变量中的特定示例代码恰好(无关地)使用了未初始化的变量 - 导致混淆。

最佳答案

你不必在协议(protocol)的采用者中实现p,因为协议(protocol)扩展已经提供了一个实现。这就是协议(protocol)扩展

更简单的例子:

protocol P {}
extension P {
    func greet() {print("hello")}
}
class C : P {}
C().greet()

请注意 (1) 即使 C 没有声明 greet 也会编译,(2) 即使 C 不包含 greet 的实现它也会运行。那是因为这是协议(protocol)扩展的工作。

关于ios - 协议(protocol)扩展似乎没有在消费者中强制执行变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41796998/

相关文章:

ios - swift 3 : How do you wrap content in a tableviewcell with multiple labels?

ios - iOS 9 iPad Slide Over 和 Split View 中的状态栏颜色错误

ios - Swift:无法播放基于数组的每个声音序列

ios - 如何在 iOS 中仅获取可见日历

ios - 如何声明也符合协议(protocol)的特定类的属性?

ios - 快速检查类是否具有封装协议(protocol)

ios - 在iCarousel中,图像重叠。

ios - 有没有办法防止在 MapboxGL for iOS 中滚动时标注消失?

ios - Swift 中的随机数

USB:可以在一个接口(interface)上定义多个不同的 HID 操纵杆吗?