可以说我已经创建了这个协议和几个类
import UIKit
protocol ControllerConstructorProtocol {
class func construct() -> UIViewController?
}
class MyConstructor: ControllerConstructorProtocol {
class func construct() -> UIViewController? {
return UIViewController()
}
}
class MyOtherConstructor: ControllerConstructorProtocol {
class func construct() -> UIViewController? {
return UITableViewController(style: .Grouped)
}
}
现在,我想声明一个数组,其中包含符合此类协议的对象类。我该如何申报?理想情况下,我希望编译器检查数组(在编译时)是否正确填充,而不是自己在运行时(运行时)检查它as
。
这是我尝试的没有成功的方法:(
‘任何对象都没有名为’construct’的成员
var array = [
MyConstructor.self,
MyOtherConstructor.self,
]
var controller = array[0].construct() // << ERROR here
类型“ MyConstructor.Type”不符合协议“ ControllerConstructorProtocol”
var array: Array<ControllerConstructorProtocol> = [
MyConstructor.self, // << ERROR here
MyOtherConstructor.self,
]
编辑2016/04/23 :在Swift 2.2(Xcode7.3)中,可以写@rintaro的原始想法:)
let array: Array<ControllerConstructorProtocol.Type> = [
MyConstructor.self,
MyOtherConstructor.self,
]
let viewController = array[0].construct()
可以像这样声明“符合协议的类的数组” Array<TheProtocol.Type>
。
您可以:
var array: Array<ControllerConstructorProtocol.Type> = [
MyConstructor.self,
MyOtherConstructor.self,
]
但…,
array[0].construct()
// ^ error: accessing members of protocol type value 'ControllerConstructorProtocol.Type' is unimplemented
该项目的调用方法是“未实现”。
到目前为止,您必须将协议声明为@objc
,并通过调用该方法AnyClass
。此外,由于某些原因,我们不能直接施放array[0]
到AnyClass
,相反,我们必须把它转换为Any
,然后AnyClass
。
@objc protocol ControllerConstructorProtocol {
class func construct() -> UIViewController?
}
var array: Array<ControllerConstructorProtocol.Type> = [
MyConstructor.self,
MyOtherConstructor.self,
]
let vc = (array[0] as Any as AnyClass).construct()
注意:投放问题已在Swift 1.2 / Xcode 6.3中修复。但是“未实现”是“未实现” :(
只是随机的想法:
这取决于您的实际用例,但是在这种特殊情况下,()-> UIViewController?
闭包数组就足够了:
var array: [() -> UIViewController?] = [
MyConstructor.construct,
MyOtherConstructor.construct,
]
let vc = array[0]()
如果您有几种方法,则可能要使用协议的类型擦除的包装器。
protocol ControllerConstructorProtocol {
class func construct() -> UIViewController?
class func whoami() -> String
}
struct ControllerConstructorWrapper {
private let _construct: () -> UIViewController?
private let _whoami: () -> String
init<T: ControllerConstructorProtocol>(_ t:T.Type) {
_construct = { t.construct() }
_whoami = { t.whoami() }
}
func construct() -> UIViewController? { return _construct() }
func whoami() -> String { return _whoami() }
}
var array: [ControllerConstructorWrapper] = [
ControllerConstructorWrapper(MyConstructor),
ControllerConstructorWrapper(MyOtherConstructor),
]
let who = array[0].whoami()
let vc = array[0].construct()
问题内容: 我有一个符合多种协议的Objective-C变量。 我将如何在Swift中代表这种类型? 问题答案: 这应该工作: 注意,必须快速使用NSObjectProtocol而不是NSObject。 以下是一些其他示例: 符合多种协议的对象数组: 具有符合多种协议的参数的功能: 对于3.1之前的Swift版本,请使用:
问题内容: 在Swift中,我可以通过声明如下来显式设置变量的类型: 如果我们想更进一步,并声明一个符合多种协议的变量,可以使用声明式: 如果我想声明一个符合一个或多个协议并且也是特定基类类型的对象,该怎么办?等效的Objective-C看起来像这样: 在Swift中,我希望它看起来像这样: 这使我们能够灵活处理基本类型的实现以及协议中定义的添加接口。 还有其他更明显的方式可能会让我丢失吗? 例
问题内容: 编译错误如下: 类型“ AnyObject”不符合协议“ SequenceType” 这种压力是什么? 谁能帮我很多忙! 问题答案: 苹果在Swift编程语言中指出: for-in循环针对范围,序列,集合或进度中的每个项目执行一组语句。 目前,它仅符合protocol ,因此您无法在其上使用for循环。如果要这样做,则必须执行类似以下操作:
问题内容: 我正在尝试为我们的应用程序快速制作一个简单的依赖注入系统,为期2天。我对任何解决方案都比较灵活,但是我想要一些东西,所以我可以说“给我一个符合该协议的实例”,返回的实际类型可以是只要符合所述协议的任何类型。我已经尝试了很多方法,包括泛型,但是设法弄清了它是否真的可以工作,所以现在我只涉及基本知识,例如: 我知道它并不漂亮,但是现在,我对性能/错误代码并不挑剔,只要它能解决解耦问题(最好
问题内容: Beta 3一切正常,现在出现一个奇怪的错误,而且我不知道如何解决它。尝试了所有类似问题的解决方案。 这是我的代码: 两条标记线都给了我相同的错误: 类型“ String.Index”不符合协议“ IntegerLiteralConvertible” 有人能帮我吗?还是Beta 4有漏洞?谢谢! 问题答案: 在Beta 4中,Swift的String.Index处理再次发生了变化- 现
问题内容: 我正在尝试找到使用Swift 4中新的JSONDecoder / Encoder对符合swift协议的结构数组进行编码/解码的最佳方法。 我做了一个小例子来说明这个问题: 首先,我们有一个协议标签和一些符合该协议的类型。 然后我们有一个带有标签数组的Type Article。 最后,我们对文章进行编码或解码 这是我喜欢的JSON结构。 问题是,在某些时候,我必须打开type属性以解码A