ios - 带有协议(protocol)的 Swift 实例变量

标签 ios objective-c swift jsonmodel

我必须将以下几行 Objective-c 代码翻译成 swift。这是来自 Objective-c JSONModel-Framework 的示例其中,框架提供的 Optional 协议(protocol)应用于 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
...

最佳答案

<>不是为了符合协议(protocol)。它适用于具有泛型的类型,例如数组:

Array<T>

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

你想要别的东西,一个变量应该是一个类型 String 遵守协议(protocol)


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

由于您的 Optional协议(protocol)是空的,这样写就足够了:

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

要创建协议(protocol),请在 Swift 中编写:

protocol Optional {}

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


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

extension NSString: JsonOptProtocol {}

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

Documentation link.

关于ios - 带有协议(protocol)的 Swift 实例变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25506758/

相关文章:

objective-c - 使用 Objective c 将 void *(void * const mAudioData) 转换为 Short *?

ios - 如何在 Swift 中表示核心数据可选标量(Bool/Int/Double/Float)?

ios - Swift 通用函数来推送任何 View Controller

ios - 禁用 UIPageViewController 弹跳 - Swift

ios - 将触摸转发到 UIPageViewController

ios - 将图像复制到iOS中的粘贴板

objective-c - subarrayWithRange 在不可变数组 (NSArray) 上执行时是否创建副本?

ios - 在 Swift 3 中调用 flashScrollIndicators() 时如何更改滚动条的颜色

swift - "Expected type before ->": When adding a target to a button

ios - 内存增长之谜(Objective-C)