class 作为自己的代表是否遵循 iOS 约定?
Does a class being its own delegate follow iOS convention?
抱歉,这个问题听起来可能 "subjective",但我认为它应该有一个非常明确的答案。我有一个 class "LocationManager",我想管理我的核心位置逻辑。我有两个选择:
LocationManager 有一个强 属性 引用 CLLocationManager 的实例。 LocationManager 是 CLLocationManager 的委托,并从中接收位置更新。
LocationManager 是 CLLocationManager 的子class,并且说 self.delegate = self 以便它可以接收自己的位置更新。
我很好奇这些选项中的哪一个被认为是 "right" 要做的事情,我相信一定有一个首选的方法。谢谢!
是的,你可以毫无问题地做到这一点。我有一个 UITextField 的子类,它是它自己的委托。
第一个选项对我来说似乎是正确的,因为它对 subclass CLLocationManager
(#2) 没有多大意义。您要添加什么功能?如果您不向其中添加任何内容,为什么要使用 subclass?
您所关心的只是封装有关位置更新的消息。我会说您在第一种情况下可以接受地使用 delegate/protocol 模式。
Jef 是对的,有时可以将另一个 class 的子 class 设置为自己的委托。尽管您需要注意该对象如何响应某些消息。
Subclassing CLLocationManager
并将其委托设置为 self 不应完成,因为它违反了 CLLocationManager
的契约。由于当前定义了 class,因此它具有 delegate
属性。此 属性 用作合同,声明您可以将此 属性 设置为其他某个对象,并且此对象将接收委托通知。如果你 subclass CLLocationManager
(我们称它为 MyLocationManager
),并且如果对象的委托 属性 指向它自己,那么你很可能会创建这样一种情况 MyLocationManager
仅在用户 未 将 delegate
属性 用于他自己的目的时才按承诺工作。从用户的角度来看,MyLocationManager
是 CLLocationManager
而没有可用的 delegate
属性。这违反了 Liskovs Substitution Principle,顺便说一句。这里要问的问题是:如果某些 ViewController
class 决定使用它并让它的 delegate
属性 指向它自己( ViewController
)?
而且,如果你说self.delegate = self
,就不再是"delegation"了。所以我会说最好使用变体 1。
感谢提问。
抱歉,这个问题听起来可能 "subjective",但我认为它应该有一个非常明确的答案。我有一个 class "LocationManager",我想管理我的核心位置逻辑。我有两个选择:
LocationManager 有一个强 属性 引用 CLLocationManager 的实例。 LocationManager 是 CLLocationManager 的委托,并从中接收位置更新。
LocationManager 是 CLLocationManager 的子class,并且说 self.delegate = self 以便它可以接收自己的位置更新。
我很好奇这些选项中的哪一个被认为是 "right" 要做的事情,我相信一定有一个首选的方法。谢谢!
是的,你可以毫无问题地做到这一点。我有一个 UITextField 的子类,它是它自己的委托。
第一个选项对我来说似乎是正确的,因为它对 subclass CLLocationManager
(#2) 没有多大意义。您要添加什么功能?如果您不向其中添加任何内容,为什么要使用 subclass?
您所关心的只是封装有关位置更新的消息。我会说您在第一种情况下可以接受地使用 delegate/protocol 模式。
Jef 是对的,有时可以将另一个 class 的子 class 设置为自己的委托。尽管您需要注意该对象如何响应某些消息。
Subclassing CLLocationManager
并将其委托设置为 self 不应完成,因为它违反了 CLLocationManager
的契约。由于当前定义了 class,因此它具有 delegate
属性。此 属性 用作合同,声明您可以将此 属性 设置为其他某个对象,并且此对象将接收委托通知。如果你 subclass CLLocationManager
(我们称它为 MyLocationManager
),并且如果对象的委托 属性 指向它自己,那么你很可能会创建这样一种情况 MyLocationManager
仅在用户 未 将 delegate
属性 用于他自己的目的时才按承诺工作。从用户的角度来看,MyLocationManager
是 CLLocationManager
而没有可用的 delegate
属性。这违反了 Liskovs Substitution Principle,顺便说一句。这里要问的问题是:如果某些 ViewController
class 决定使用它并让它的 delegate
属性 指向它自己( ViewController
)?
而且,如果你说self.delegate = self
,就不再是"delegation"了。所以我会说最好使用变体 1。
感谢提问。