假设我有这些协议:
protocol SomeProtocol {
}
protocol SomeOtherProtocol {
}
Run Code Online (Sandbox Code Playgroud)
现在,如果我想要一个采用泛型类型的函数,但该类型必须符合SomeProtocol我可以做的:
func someFunc<T: SomeProtocol>(arg: T) {
// do stuff
}
Run Code Online (Sandbox Code Playgroud)
但有没有办法为多个协议添加类型约束?
func bothFunc<T: SomeProtocol | SomeOtherProtocol>(arg: T) {
}
Run Code Online (Sandbox Code Playgroud)
类似的东西使用逗号,但在这种情况下,它会启动一个不同类型的声明.这是我尝试过的.
<T: SomeProtocol | SomeOtherProtocol>
<T: SomeProtocol , SomeOtherProtocol>
<T: SomeProtocol : SomeOtherProtocol>
Run Code Online (Sandbox Code Playgroud) 我必须将以下几行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)
...
/**
* 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:
* …Run Code Online (Sandbox Code Playgroud) 我目前正在一个主要是Objective-C的项目中编写一些Swift代码.在我们的ObjC代码中,我们有一个声明的标头typedef GPUImageOutput<GPUImageInput> MyFilter;.然后我们可以声明一个只能是GPUImageOutput实现的子类的@property GPUImageInput.
(注:GPUImageOutput和GPUImageInput是不是我定义的;它们是部分GPUImage库)
我们的Swift代码似乎没有认识到这一点,即使标题在我们的桥接标题中是#imported.我试图在Swift中复制声明,但这些都不是正确的语法:
typealias MyFilter = GPUImageOutput, GPUImageInput
typealias MyFilter = GPUImageOutput : GPUImageInput