【问题标题】:is Swift strictly enforcing Class in protocol vars?Swift 在协议变量中严格执行 Class 吗?
【发布时间】:2016-07-29 22:30:11
【问题描述】:

协议P 需要vC 的变量。

X 实现协议P 声明类C1 的变量v,其中C1 扩展C

代码如下:

import Foundation    

class C { }
class C1: C { }

protocol P {
    var v: C { get set }
}

class X: P {
    var v: C1

    init(withV v: C1) {
        self.v = v
    }
}

Xcode 抱怨此错误:

Type 'X' does not conform to protocol 'P'
Protocol requires property 'v' with type 'C'
Candidate has non-matching type 'C1'

为什么编译器强制我匹配协议中声明的完全相同的类型?

编辑:

在 Obj-C 中完全相同的实现编译时不会出现错误或警告

@interface C: NSObject
@end
@implementation C
@end

@interface C1: C
@end
@implementation C1
@end

@protocol P <NSObject>
    @property (nonatomic, strong) C *v;
@end

@interface X: NSObject <P>
    @property (nonatomic, strong) C1 *v;
@end
@implementation X
@end

【问题讨论】:

    标签: swift protocols var swift2.2


    【解决方案1】:

    它不会强制您完全匹配,但会强制您避免运行时问题。您的设置可能意味着您传递了对声称符合 P 但实际上并不符合的东西的引用。这是因为P 表示您可以将v 设置为任何C,但X 表示您可以将v 设置为任何C1

    因此,如果您要创建 CC2 的另一个子类并尝试使用它,那么一切都会崩溃。

    我希望您的 obj-c 示例抱怨您没有实现或合成协议中指定存在的属性...

    【讨论】:

    • Obj-C 根本没有抱怨,但我只是发现协议中的集合意味着在运行时每个人都可以将v 设置为C 类和X 可以无法访问C,就好像它是C1。感谢您的回答。
    猜你喜欢
    • 2023-03-16
    • 2015-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多