Swift协议实例变量

5
我需要将以下Objective-c代码转换为Swift。这是来自Objective-c JSONModel-Framework的示例,其中将框架提供的Optional协议应用于类型为NSString的实例变量。我找到了一个相关帖子,但我没有成功。使用我的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
@Antonio:更新了描述 - robbiebubble
谢谢Antonio。JSONModel框架实际上可以与Swift一起使用,只要您在Swift类实例变量中使用Objective-C类型,并使用@objc(MYModel)注释该类即可。 - robbiebubble
由于我找不到另一个能够在Swift中进行正确的对象图映射(从/到JSON)的框架,所以目前我还是接受它。至少目前是这样的... :) - robbiebubble
我发现这篇博客文章很有启发性 - 它是纯Swift编写的,一开始可能有点难以理解。但我已经用它开发了自己的框架,目前运行良好(不幸的是,它是闭源的,也许在不久的将来我会被允许开放它)。 - Antonio
显示剩余2条评论
2个回答

1
"

<>不是用于符合协议的。它是用于带有泛型的类型,例如Array:

"
Array<T>

所以你可以写成var a: Array<String>
你想要其他的东西,一个变量应该是类型为String并符合协议。
你可以使用协议扩展String并自行添加所需的函数。
由于你的Optional协议是空的,因此只需要编写:
extension NSString: Optional {} // you can use String if you like

使用Swift编写协议:

protocol Optional {}

你也可以使用Objective-C创建协议。


你不应该使用Optional,因为Swift已经有一个类似的类型,但是由于Swift有命名空间,所以它可以正常工作。 当然,你可以像这样编写代码:

extension NSString: JsonOptProtocol {}

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

文档链接。


谢谢您的回答!那正是我在寻找的。如果我尝试使用您的示例 extension NSString: Optional{},Xcode会抱怨Reference to generic type Optional requires arguments in <...> - robbiebubble
哈哈,那真有趣,你不应该使用Optional,因为文档中已经有一个了。当然,你必须创建协议,这是我的回答。 - Binarian
它与Optional一起工作,因为它知道你正在使用自己创建的名为“Optional”的协议。当然,你也可以为你的协议使用另一个名称。 - Binarian

0

Optional是Swift标准库中声明的一种类型,目前由于这个原因,JSONModel与Swift不兼容。


我明白了。作为一种解决方法,我可以重写JSONModel的propertyIsOptional方法来将所有参数设置为“可选”(这对我来说没问题),同时在validate方法中处理可能的验证。 - robbiebubble
是的,我想一个快速解决方法将是从JSONModel文件中删除可选协议,然后在您的模型中只使用propertyIsOptional。 - Marin Todorov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接