GVKun编程网logo

Swift协议继承和协议一致性问题(swift协议继承和协议一致性问题的区别)

9

对于Swift协议继承和协议一致性问题感兴趣的读者,本文将会是一篇不错的选择,我们将详细介绍swift协议继承和协议一致性问题的区别,并为您提供关于ios–Swift协议只能设置?、ios–Swift

对于Swift协议继承和协议一致性问题感兴趣的读者,本文将会是一篇不错的选择,我们将详细介绍swift协议继承和协议一致性问题的区别,并为您提供关于ios – Swift协议只能设置?、ios – Swift协议和类的弱引用、ios – Swift的等同协议一致性检查、ios – 在Swift中设置和协议的有用信息。

本文目录一览:

Swift协议继承和协议一致性问题(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?

考虑这是否会发生什么
可能的,你上溯造型的一个实例,并DashboardPresenterDashboardViewProtocol。您将能够分配符合BasePresenterProtocol类型属性的任何内容,DashboardPresenterProtocol?这将是非法的。

因此,读写属性要求 _必须_是不变的(尽管值得注意的是,只读属性要求应该可以是协变的,但是当前不支持。

ios – Swift协议只能设置?

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定义),为什么还要使用它?

解决方法

根据 official documentation:

吸气剂和固化剂的要求可以通过各种方式的一致性类型来满足.如果属性声明包含get和set关键字,则一致的类型可以使用存储的变量属性或可读写的计算属性(即实现getter和setter的一个)来实现.但是,该属性声明不能实现为常量属性或只读计算属性.如果属性声明仅包含get关键字,则可以将其实现为任何类型的属性.

ios – Swift协议和类的弱引用

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的等同协议一致性检查

ios – Swift的等同协议一致性检查

我试图用以下函数扩展 Swift的Array类:

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
}

解决方法

指定T必须在Method的签名中相等:

func containsObjectIdenticalTo<T: Equatable>(obj: T) -> Bool {/*...*/}

ios – 在Swift中设置和协议

ios – 在Swift中设置和协议

我想使用与Hashable协议和定制协议对应的值初始化一个Set.

我试过了 :

protocol CustomProtocol: Hashable {}

let set = Set<CustomProtocol>()

但Xcode抱怨:

Using ‘CustomProtocol’ as a concrete type conforming to protocol
‘Hashable’ is not supported

我该如何实现呢?

提前致谢.

解决方法

你不能做你想做的最直接的原因是Hashable是一个通用协议.因此,它 – 或从它派生的协议 – 不能用作集合的元素类型.通用类型只能作为另一个泛型的约束使用.您将注意到您无法声明Set< Hashable>即使一个集合的元素类型必须符合Hashable.

最简单的方法是制作,而不是一组协议,而是一组对象类型.例如,如果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中设置和协议的相关信息,可以在本站进行搜索。

本文标签: