带协议的Swift实例变量

rob*_*ble 5 objective-c ios jsonmodel swift

我必须将以下几行Objective-c代码翻译成swift.这是来自Objective-c JSONModel-Framework的示例,其中FrameworkOptional提供的协议应用于类型的实例变量NSString.我发现了一个相关的帖子,但我没有设法实现它.随着我的MYModel.swift实现Xcode抱怨Cannot specialize non-generic type NSString

谢谢你的帮助!

MYModel.swift

@objc(MYModel) public class MYModel : JSONModel {
   ...
   public var name : NSString<Optional>
   ...
}
Run Code Online (Sandbox Code Playgroud)

MYModel.h

@interface MYModel : JSONModel
...
@property (strong, nonatomic) NSString<Optional>* name; 
...
Run Code Online (Sandbox Code Playgroud)

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
...
Run Code Online (Sandbox Code Playgroud)

Bin*_*ian 1

和不代表符合协议<。它适用于具有泛型(如数组)的类型:>

Array<T>
Run Code Online (Sandbox Code Playgroud)

所以你可以写var a: Array<String>

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


您可以使用协议扩展 String 并自行添加所需的函数。

由于您的Optional协议是空的,因此编写以下内容就足够了:

extension NSString: Optional {} // you can use String if you like
Run Code Online (Sandbox Code Playgroud)

要创建协议,请使用 Swift 编写:

protocol Optional {}
Run Code Online (Sandbox Code Playgroud)

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


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

extension NSString: JsonOptProtocol {}

protocol JsonOptProtocol {} // or create that in Objective-C like you did
Run Code Online (Sandbox Code Playgroud)

文档链接。