可识别协议定义为在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注释如何工作?
答案 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'