- Proposal: SE-0124
- Author: Arnold Schwaighofer
- Review Manager: Chris Lattner
- Status: Implemented (Swift 3.0)
- Decision Notes: Rationale
- Bug: SR-2064
Int.init(ObjectIdentifier)
and UInt.init(ObjectIdentifier)
should have a
'bitPattern:’ label to make it clear at the use site that we interpret the value
as a bit pattern.
public func <(lhs: ObjectIdentifier, rhs: ObjectIdentifier) -> Bool {
return UInt(bitPattern: lhs) < UInt(bitPattern: rhs)
}
- Swift-evolution thread: Pitch
- Swift Bug: SR-2064
- Branch with change to stdlib: [int_init_objectidentifier_label] (https://github.com/aschwaighofer/swift/tree/int_init_objectidentifier_label)
In Swift we have ObjectIdentifier
values which uniquely identify a class
instance or metatype. They are implemented as a struct which holds the value of
the reference to the instance or metatype as a raw pointer.
/// A unique identifier for a class instance or metatype.
public struct ObjectIdentifier : Hashable, Comparable {
internal let _value: Builtin.RawPointer
...
}
We have constructors for Int
and UInt
that capture this value. These
constructors don’t have an argument label.
extension UInt {
/// Create a `UInt` that captures the full value of `objectID`.
public init(_ objectID: ObjectIdentifier) {
self.init(Builtin.ptrtoint_Word(objectID._value))
}
}
extension Int {
/// Create an `Int` that captures the full value of `objectID`.
public init(_ objectID: ObjectIdentifier) {
self.init(bitPattern: UInt(objectID))
}
}
This proposals suggest adding a label bitPattern:
to the constructor.
extension UInt {
/// Create a `UInt` that captures the full value of `objectID`.
public init(bitPattern objectID: ObjectIdentifier) {
self.init(Builtin.ptrtoint_Word(objectID._value))
}
}
extension Int {
/// Create an `Int` that captures the full value of `objectID`.
public init(bitPattern objectID: ObjectIdentifier) {
self.init(bitPattern: UInt(objectID))
}
}
Adding a label bitPattern
to the constructors makes it clear that we interpret
the pointer value as a bit pattern at the use site. It is similar to what we do
in other APIs, for example in UInt(bitPattern: UnsafePointer<Void>(value)))
.
See above.
We will change the initializers of Int
and UInt
as shown above. The compiler
will suggest corrections in existing code because we mark the old API
unavailable.
Existing code will have to add the argument label.
Leave as is. The API will be inconsistent with other APIs such as the
UInt(bitPattern: UnsafePointer<T>)
API.