【问题标题】:Swift: "Mixing in" properties斯威夫特:“混入”属性
【发布时间】:2014-08-10 04:43:15
【问题描述】:

我将从我正在尝试做的事情开始:我想创建一个漂亮的小 mixin,UIViews 可以利用它来抽象出预期的触摸事件(即,“以用户现在拖动的方式,做他们真的很想完成这个动作”)。

我认为最好的方法是使用一个类别,但我发现它们已被 swift 中的“扩展”取代。大多。显然,现在所有属性都已计算。

为了使这个 mixin 工作,我需要一个本地存储属性来存储令牌“意图缓冲区”。但是,任何向扩展添加 var 的尝试都会出现关于我需要如何提供 setter 和 getter 的错误。出于同样的原因,协议将不起作用。如果我在扩展程序旁边创建一个协议,我仍然必须有一个本地 ivar 来存储这个新属性。

所以两个问题之一:

我是否会走很长的路?如果是,我应该怎么做?

我该如何做一些事情,我可以创建一个类似“mixin”的结构,允许我定义应该混入的简单属性和方法?

【问题讨论】:

  • 混合不是 Cocoa 使用的模式。您能否为您尝试做的事情提供更具体的用例。比“用户现在拖动的方式,他们真的要完成这个动作”更具体。
  • 假设我正在向下拖动拇指以拉入新视图。如果拖动只是 3px,也许我想取消拉入新视图。但是如果拖动是 10px 并且向下,我想引入新视图。相反,如果他们拖了 20px,然后又开始往上推,我可以推断他们可能根本不打算拉入视图,然后最终取消引入新视图。这似乎是 iOS 中很常见的白话,我想维护它。我可以想到许多在单一上下文之外这可能有用的实例。
  • @Kreiri 我不这么认为;这并没有解决我的问题。虽然也许我遗漏了一些东西,所以如果你能向我解释它们是如何相关的。
  • “显然属性现在都是计算的” - 您也不能将属性/变量添加到 Objective C 类别中的类。您可以通过使用 objc 运行时函数设置/获取类别中的关联对象来绕过它。

标签: ios architecture swift


【解决方案1】:

Mixins 不是用于 Cocoa 的模式,无论是 Swift 还是 Objective-C。正如您所发现的,类别不能添加额外的 ivars,并且协议只定义一个接口,所以也没有 ivars。

Cocoa 通常更喜欢使用对象(或封装)而不是继承。继承确实被使用了,但它只是单一继承,所以混合是不可能的。而且他们永远都不需要。

对于所描述的用例,正确的方法是通过手势识别器。信息和代码可以在这里找到:

https://developer.apple.com/library/ios/documentation/EventHandling/Conceptual/EventHandlingiPhoneOS/GestureRecognizer_basics/GestureRecognizer_basics.html#//apple_ref/doc/uid/TP40009541-CH2-SW2

【讨论】:

  • 这看起来像是对我第一个问题的回答,我来看看API;谢谢。
  • 我已经添加了有关您的 mixins 问题的更多信息。
猜你喜欢
  • 1970-01-01
  • 2017-07-22
  • 2017-03-24
  • 1970-01-01
  • 2015-05-22
  • 2016-02-08
  • 2017-11-13
  • 2015-08-19
  • 2014-09-11
相关资源
最近更新 更多