对于Swift协议继承和协议一致性问题感兴趣的读者,本文将会是一篇不错的选择,我们将详细介绍swift协议继承和协议一致性问题的区别,并为您提供关于ios–Swift协议只能设置?、ios–Swift
对于Swift协议继承和协议一致性问题感兴趣的读者,本文将会是一篇不错的选择,我们将详细介绍swift协议继承和协议一致性问题的区别,并为您提供关于ios – Swift协议只能设置?、ios – Swift协议和类的弱引用、ios – Swift的等同协议一致性检查、ios – 在Swift中设置和协议的有用信息。
本文目录一览:- Swift协议继承和协议一致性问题(swift协议继承和协议一致性问题的区别)
- ios – Swift协议只能设置?
- ios – Swift协议和类的弱引用
- ios – Swift的等同协议一致性检查
- ios – 在Swift中设置和协议
Swift协议继承和协议一致性问题(swift协议继承和协议一致性问题的区别)
protocol BasePresenterProtocol : class {}
protocol DashboardPresenterProtocol : BasePresenterProtocol {}
final class DashboardPresenter { weak var view: DashboardPresenterProtocol? init() { self.view = DashboardViewController() } func test() { print("Hello") }}extension DashboardPresenter: DashboardViewProtocol { }protocol BaseViewProtocol : class { weak var view: BasePresenterProtocol? { get set }}protocol DashboardViewProtocol : BaseViewProtocol {}class DashboardViewController {}extension DashboardViewController: DashboardPresenterProtocol { }
在上面的代码中,我在下一行收到错误
extension DashboardPresenter: DashboardViewProtocol { }
,DashboardPresenter
但未确认协议DashboardViewProtocol
,但我已weak var view:DashboardPresenterProtocol?
在中声明DashboardPresenter
。虽然我已经宣布
为什么会出现此错误?请让我知道我在这段代码中做错了什么。
答案1
小编典典您不能使用type BasePresenterProtocol?
属性来实现type
的读写属性要求DashboardPresenterProtocol?
。
考虑这是否会发生什么 是
可能的,你上溯造型的一个实例,并DashboardPresenter
到DashboardViewProtocol
。您将能够分配符合BasePresenterProtocol
类型属性的任何内容,DashboardPresenterProtocol?
这将是非法的。
因此,读写属性要求 _必须_是不变的(尽管值得注意的是,只读属性要求应该可以是协变的,但是当前不支持。
ios – Swift协议只能设置?
var testDto = ModelDto(modelId: 1) testDto.objectId = 2
而我定义这个:
protocol DataTransferObject { var objectType: DtoType { get } var parentObjectId: Int { get set } var objectId: Int { get } var objectName: String { get set } } struct ModelDto: DataTransferObject { var objectType: DtoType var parentObjectId: Int var objectId: Int var objectName: String init(modelId: Int) { self.objectType = DtoType.Model self.objectId = modelId self.parentObjectId = -1 self.objectName = String() } }
如果我的协议中的定义大部分被忽略(getter,setter定义),为什么还要使用它?
解决方法
吸气剂和固化剂的要求可以通过各种方式的一致性类型来满足.如果属性声明包含get和set关键字,则一致的类型可以使用存储的变量属性或可读写的计算属性(即实现getter和setter的一个)来实现.但是,该属性声明不能实现为常量属性或只读计算属性.如果属性声明仅包含get关键字,则可以将其实现为任何类型的属性.
ios – Swift协议和类的弱引用
protocol SomeProtocol { func doSomething() }
在辅助类中,我有一个协议变量的引用:
class someClass { var delegate: SomeProtocol? }
因为SomeProtocol没有标记为:class,所以假设委托可以是任何东西,在值类型(结构和枚举)的情况下,不需要弱变量因为值类型不能创建强引用.事实上,编译器不允许除类类型之外的任何弱变量.
但是,没有什么能阻止您将类设置为委托,并且如果协议未标记为:class(如SomeProtocol所示),则无法使用weak var`并创建保留周期.
class MyClass: NSObject,SomeProtocol { func doSomething() { } } struct MyStruct: SomeProtocol { func doSomething() { } } let someClass = SomeClass() let myStruct = MyStruct() someClass.delegate = myStruct // After myStruct gets assigned to the delegate,do the delegate and the struct refer to the same instance or does the struct get copied?D let myClass = MyClass() someClass.delegate = myClass // can't use weak var so myClass is retained
鉴于上面的例子,在使用委托和数据源的情况下,不应该:class总是被使用?基本上任何用于维护引用的协议都应该始终限制为类对象吗?
解决方法
ios – Swift的等同协议一致性检查
func containsObjectIdenticalTo(obj: T) -> Bool { // objectPassingTest returns the first object passing the test return objectPassingTest { x in x == obj } }
显然,这不会编译,因为编译器还不知道是否为类型T实现了==我然后将代码更改为此
func containsObjectIdenticalTo(obj: T) -> Bool { return objectPassingTest { x in assert(x is Equatable && obj is Equatable) return (x as Equatable) == (obj as Equatable) } != nil }
哪个也不起作用,因为无法检查对Equatable的一致性(因为Equatable没有用@obj定义)!
有什么想法吗?如果有一种方法可以直接断言如果T符合Equatable,那会很好,但我还没有读到任何地方.在这些东西中,Swift似乎没有Obj-C那么动态.
更新:
尝试了这个建议并且它不起作用(不知道究竟是什么< T:Equatable>用于,它确实编译).
func containsObjectIdenticalTo<T: Equatable>(obj: T) -> Bool { var x = self[0] var y = self[0] return x == y // Error here }
解决方法
func containsObjectIdenticalTo<T: Equatable>(obj: T) -> Bool {/*...*/}
ios – 在Swift中设置和协议
我试过了 :
protocol CustomProtocol: Hashable {} let set = Set<CustomProtocol>()
但Xcode抱怨:
Using ‘CustomProtocol’ as a concrete type conforming to protocol
‘Hashable’ is not supported
我该如何实现呢?
提前致谢.
解决方法
最简单的方法是制作,而不是一组协议,而是一组对象类型.例如,如果S是符合CustomProtocol的结构(因为它符合Hashable加上任何其他CustomProtocol所需),则可以声明一组S.
例:
protocol CustomProtocol: Hashable { } func ==(lhs:S,rhs:S) -> Bool { return lhs.name == rhs.name } struct S : CustomProtocol { var name : String var hashValue : Int { return name.hashValue } } let set = Set<S>()
如果您想要解决的问题是您想要一个混合类型的集合,但是在某种程度上彼此相当,那么这是通过协议扩展解决的同样的问题,如协议中的讨论所解释的 – 面向WWDC 2015视频.
但是,只要使所有类型的类从NSObject派生,这将变得更简单.您仍然可以使它们采用一些辅助协议,当然,但是该集合不会被定义为一组该协议,而是NSObject.
我们今天的关于Swift协议继承和协议一致性问题和swift协议继承和协议一致性问题的区别的分享就到这里,谢谢您的阅读,如果想了解更多关于ios – Swift协议只能设置?、ios – Swift协议和类的弱引用、ios – Swift的等同协议一致性检查、ios – 在Swift中设置和协议的相关信息,可以在本站进行搜索。
本文标签: