【问题标题】:Swift instance variable with protocol带有协议的 Swift 实例变量
【发布时间】:2014-08-26 13:13:48
【问题描述】:

我必须将以下几行 Objective-c 代码翻译成 swift。这是来自 Objective-c JSONModel-Framework 的示例,其中框架提供的Optional 协议应用于NSString 类型的实例变量。我找到了related post,但我没有成功。使用我的MYModel.swift 实现 Xcode 抱怨Cannot specialize non-generic type NSString

感谢您的帮助!

MYModel.swift

@objc(MYModel) public class MYModel : JSONModel {
   ...
   public var name : NSString<Optional>
   ...
}

MYModel.h

@interface MYModel : JSONModel
...
@property (strong, nonatomic) NSString<Optional>* name; 
...

JSONModel.h

...
/**
 * Protocol for defining optional properties in a JSON Model class. Use like below to define 
 * model properties that are not required to have values in the JSON input:
 * 
 * @property (strong, nonatomic) NSString<Optional>* propertyName;
 *
 */
@protocol Optional
@end
...

【问题讨论】:

  • 您在翻译时遇到了什么问题?
  • @Antonio:更新描述
  • 你可能会遇到问题。 Swift 在语言级别已经有了可选变量,非可选变量必须在实例化期间始终初始化。但除此之外,我认为您使用的 JSON 框架使用反射/自省来填充实例,这在 swift 中不会起作用
  • 谢谢安东尼奥。 JSONModel 框架实际上与 swift 一起工作,只要你为你的 swift 类实例变量使用 Objective-c 类型并用 @objc(MYModel) 注释类
  • 是的,没错,但是使 objc 自动兼容意味着您不能使用 swift 特定的功能 - 例如泛型。只要你没问题...

标签: ios objective-c swift jsonmodel


【解决方案1】:

&lt;&gt; 不适用于符合协议。它适用于具有泛型的类型,例如 Array:

Array<T>

所以你可以写var a: Array&lt;String&gt;

你想要别的东西,变量应该是类型String并且符合协议


您可以使用协议扩展 String 并自己添加所需的功能。

既然你的Optional协议是空的,写就够了:

extension NSString: Optional {} // you can use String if you like

使用 Swift 创建协议编写:

protocol Optional {}

Objective-C 也可以创建协议。


你不应该使用 Optional,因为已经有一个,但是因为 Swift 有命名空间,所以它可以工作。 你当然可以这样写:

extension NSString: JsonOptProtocol {}

protocol JsonOptProtocol {} // or create that in Objective-C like you did

Documentation link.

【讨论】:

  • 感谢您的回答!这实际上是我正在寻找的。如果我尝试您的示例 extension NSString: Optional{} Xcode 抱怨 Reference to generic type Optional requires arguments in &lt;...&gt;
  • 哈哈,真有趣,你不应该使用 Optional,因为文档中已经有一个。当然,您必须创建协议,添加到答案中。
  • 它与 Optional 一起使用,因为它知道您正在使用您自己创建的名为 Optional 的协议。当然,您也可以为您的协议使用其他名称。
【解决方案2】:

Optional 是在 Swift 标准库中声明的类型,目前 JSONModel 与 Swift 不兼容。

【讨论】:

  • 我明白了。作为一种解决方法,我可以覆盖 JSONModel 的 propertyIsOptional 方法以将所有参数设置为“可选”(这对我来说很好)以及 validate 方法来处理可能的验证。
  • 是的,我想一个快速的解决办法是从 JSONModel 文件中删除 Optional 协议,然后在你的模型中使用 propertyIsOptional
猜你喜欢
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 1970-01-01
相关资源
最近更新 更多