快速的协议可识别性@available如何工作

时间:2019-11-11 14:39:08

标签: swift protocols

可识别协议定义为在iOS 13以上版本的Swift>其他

/// A class of types whose instances hold the value of an entity with stable identity.
@available(OSX 10.15, iOS 13, tvOS 13, watchOS 6, *)
public protocol Identifiable {

    /// A type representing the stable identity of the entity associated with `self`.
    associatedtype ID : Hashable

    /// The stable identity of the entity associated with `self`.
    var id: Self.ID { get }
}

@available(OSX 10.15, iOS 13, tvOS 13, watchOS 6, *)
extension Identifiable where Self : AnyObject {

    /// The stable identity of the entity associated with `self`.
    public var id: ObjectIdentifier { get }
}

但是当我将部署目标设置为低于11.0以下的iOS 13.0 ex)时 没有任何编译错误发生。

struct People: Identifiable {
    var id: String {
        return ""
    }
}

let people = People()
print(people.id) // There are no compile error

问题是Swift.Identifiable的@available注释如何工作?

2 个答案:

答案 0 :(得分:1)

即使您支持不具有该协议的iOS版本,也可以将一个对象声明为符合该协议,否则您将无法在那些版本中使用该协议。

例如,您将无法执行以下操作:people as? Identifiable如果不将其包装在#available块中。

您可以访问people.id而不会出现编译器错误,因为它只是一个常规的String属性,即使没有Identifiable一致性,它仍然是结构的一部分。

如果您的对象被声明为类,并且依赖于它从协议一致性中获取的默认id属性,那么如果没有可用性检查,您将无法访问id属性:

class People: Identifiable {

}

let people = People()
print(people.id) // compiler error outside of #available check

答案 1 :(得分:-1)

对于最新的 xcode 12.5 和 iOS 14.5 有同样的问题。

它在 10.5.2 版本中有一个修复

只需使用以下内容更新您的 podfile:pod 'RealmSwift', '~> 10.5.2'