【发布时间】:2016-01-21 20:44:12
【问题描述】:
我制定了一个协议:
protocol SomeProtocol {
func getData() -> String
}
我做了一个符合它的结构:
struct SomeStruct: SomeProtocol {
func getData() -> String {
return "Hello"
}
}
现在我希望每个UIViewController 都有一个名为source 的属性,所以我可以做类似的事情……
class MyViewController : UIViewController {
override func viewDidLoad() {
self.title = source.getData()
}
}
为此,我创建了一个协议来定义属性:
protocol SomeProtocolInjectable {
var source: SomeProtocol! { get set }
}
现在我只需要使用这个属性来扩展视图控制器:
extension UIViewController: SomeProtocolInjectable {
// ???
}
我怎样才能将可与协议类型一起使用的存储属性组合在一起?
什么没用:
-
var source: SomeProtocol!显然不起作用,因为扩展没有存储属性 - 我不能use Objective-C associated objects,因为协议不是对象
- 我不能wrap it in a class(这对其他值类型有效,但对协议无效)
还有其他建议吗?
【问题讨论】:
-
使用静态属性对你有用吗?
-
这是一个很好的解决方法,但理想情况下不同的视图控制器会有不同的
sources。如果你想留下它作为答案,如果没有更好的结果,我会在一两天内接受它。 -
在下面查看我的答案 - 您可以使用某些 proxy 类型为每个实例实现不同的
source... -
你一定需要扩展
UIViewController,MyViewController就足够了吗?
标签: swift