Skip to content

Commit ff85c3e

Browse files
authored
convert all isEqual methods to take Any? instead of AnyObject? (swiftlang#576)
1 parent 5dc37c3 commit ff85c3e

22 files changed

+131
-79
lines changed

Foundation/Bridging.swift

+2-2
Original file line numberDiff line numberDiff line change
@@ -120,8 +120,8 @@ internal final class _SwiftValue : NSObject, NSCopying {
120120
return ObjectIdentifier(self).hashValue
121121
}
122122

123-
override func isEqual(_ object: AnyObject?) -> Bool {
124-
guard let other = object else {
123+
override func isEqual(_ object: Any?) -> Bool {
124+
guard let other = object as? NSObject else {
125125
return false
126126
}
127127
if let box = other as? _SwiftValue {

Foundation/NSArray.swift

+6-5
Original file line numberDiff line numberDiff line change
@@ -146,12 +146,13 @@ open class NSArray : NSObject, NSCopying, NSMutableCopying, NSSecureCoding, NSCo
146146
buffer.deallocate(capacity: cnt)
147147
}
148148

149-
open override func isEqual(_ object: AnyObject?) -> Bool {
150-
guard let otherObject = object, otherObject is NSArray else {
151-
return false
149+
open override func isEqual(_ value: Any?) -> Bool {
150+
if let other = value as? [Any] {
151+
return self.isEqual(to: other)
152+
} else if let other = value as? NSArray {
153+
return self.isEqual(to: other.allObjects)
152154
}
153-
let otherArray = otherObject as! NSArray
154-
return self.isEqual(to: otherArray.allObjects)
155+
return false
155156
}
156157

157158
open override var hash: Int {

Foundation/NSCalendar.swift

+9-5
Original file line numberDiff line numberDiff line change
@@ -224,12 +224,16 @@ open class NSCalendar : NSObject, NSCopying, NSSecureCoding {
224224
return Int(bitPattern: CFHash(_cfObject))
225225
}
226226

227-
open override func isEqual(_ object: AnyObject?) -> Bool {
228-
if let cal = object as? Calendar {
227+
open override func isEqual(_ value: Any?) -> Bool {
228+
if let cal = value as? Calendar {
229+
return CFEqual(_cfObject, cal._cfObject)
230+
} else if let cal = value as? NSCalendar {
231+
if cal === self {
232+
return true
233+
}
229234
return CFEqual(_cfObject, cal._cfObject)
230-
} else {
231-
return false
232235
}
236+
return false
233237
}
234238

235239
open override var description: String {
@@ -1308,7 +1312,7 @@ open class NSDateComponents : NSObject, NSCopying, NSSecureCoding {
13081312
return calHash + (32832013 * (y + yy) + 2678437 * m + 86413 * d + 3607 * h + 61 * mm + s) + (41 * weekOfYear + 11 * weekOfMonth + 7 * weekday + 3 * weekdayOrdinal + quarter) * (1 << 5)
13091313
}
13101314

1311-
open override func isEqual(_ object: AnyObject?) -> Bool {
1315+
open override func isEqual(_ object: Any?) -> Bool {
13121316
if let other = object as? NSDateComponents {
13131317
if era != other.era {
13141318
return false

Foundation/NSCharacterSet.swift

+5-4
Original file line numberDiff line numberDiff line change
@@ -49,12 +49,13 @@ open class NSCharacterSet : NSObject, NSCopying, NSMutableCopying, NSCoding {
4949
return Int(bitPattern: CFHash(_cfObject))
5050
}
5151

52-
open override func isEqual(_ object: AnyObject?) -> Bool {
53-
if let cs = object as? NSCharacterSet {
52+
open override func isEqual(_ value: Any?) -> Bool {
53+
if let cs = value as? CharacterSet {
54+
return CFEqual(_cfObject, cs._cfObject)
55+
} else if let cs = value as? NSCharacterSet {
5456
return CFEqual(_cfObject, cs._cfObject)
55-
} else {
56-
return false
5757
}
58+
return false
5859
}
5960

6061
open override var description: String {

Foundation/NSConcreteValue.swift

+2-2
Original file line numberDiff line numberDiff line change
@@ -168,8 +168,8 @@ internal class NSConcreteValue : NSValue {
168168
return memcmp(bytes1, bytes2, self._size) == 0
169169
}
170170

171-
override func isEqual(_ object: AnyObject?) -> Bool {
172-
if let other = object as? NSConcreteValue {
171+
override func isEqual(_ value: Any?) -> Bool {
172+
if let other = value as? NSConcreteValue {
173173
return self._typeInfo == other._typeInfo &&
174174
self._isEqualToValue(other)
175175
} else {

Foundation/NSData.swift

+21-5
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@ import Darwin
1515
import Glibc
1616
#endif
1717

18+
#if DEPLOYMENT_ENABLE_LIBDISPATCH
19+
import Dispatch
20+
#endif
21+
1822
extension NSData {
1923
public struct ReadingOptions : OptionSet {
2024
public let rawValue : UInt
@@ -223,12 +227,24 @@ open class NSData : NSObject, NSCopying, NSMutableCopying, NSSecureCoding {
223227
return Int(bitPattern: CFHash(_cfObject))
224228
}
225229

226-
open override func isEqual(_ object: AnyObject?) -> Bool {
227-
if let data = object as? NSData {
228-
return self.isEqual(to: data._swiftObject)
229-
} else {
230-
return false
230+
open override func isEqual(_ value: Any?) -> Bool {
231+
#if DEPLOYMENT_ENABLE_LIBDISPATCH
232+
if let data = value as? DispatchData {
233+
if data.count != length {
234+
return false
235+
}
236+
return data.withUnsafeBytes { (bytes2: UnsafePointer<UInt8>) -> Bool in
237+
let bytes1 = bytes
238+
return memcmp(bytes1, bytes2, length) == 0
239+
}
231240
}
241+
#endif
242+
if let data = value as? Data {
243+
return isEqual(to: data)
244+
} else if let data = value as? NSData {
245+
return isEqual(to: data._swiftObject)
246+
}
247+
return false
232248
}
233249
open func isEqual(to other: Data) -> Bool {
234250
if length != other.count {

Foundation/NSDate.swift

+5-4
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,13 @@ open class NSDate : NSObject, NSCopying, NSSecureCoding, NSCoding {
2828
return Int(bitPattern: CFHash(_cfObject))
2929
}
3030

31-
open override func isEqual(_ object: AnyObject?) -> Bool {
32-
if let date = object as? Date {
31+
open override func isEqual(_ value: Any?) -> Bool {
32+
if let date = value as? Date {
3333
return isEqual(to: date)
34-
} else {
35-
return false
34+
} else if let date = value as? NSDate {
35+
return isEqual(to: Date(timeIntervalSinceReferenceDate: date.timeIntervalSinceReferenceDate))
3636
}
37+
return false
3738
}
3839

3940
deinit {

Foundation/NSDictionary.swift

+6-5
Original file line numberDiff line numberDiff line change
@@ -158,12 +158,13 @@ open class NSDictionary : NSObject, NSCopying, NSMutableCopying, NSSecureCoding,
158158
self.init(objects: otherDictionary.values.map { $0 }, forKeys: otherDictionary.keys.map { _SwiftValue.store($0) })
159159
}
160160

161-
open override func isEqual(_ object: AnyObject?) -> Bool {
162-
guard let otherDictionary = object as? NSDictionary else {
163-
return false
161+
open override func isEqual(_ value: Any?) -> Bool {
162+
if let other = value as? Dictionary<AnyHashable, Any> {
163+
return isEqual(to: other)
164+
} else if let other = value as? NSDictionary {
165+
return isEqual(to: Dictionary._unconditionallyBridgeFromObjectiveC(other))
164166
}
165-
166-
return self.isEqual(to: Dictionary._unconditionallyBridgeFromObjectiveC(otherDictionary))
167+
return false
167168
}
168169

169170
open override var hash: Int {

Foundation/NSKeyedArchiverHelpers.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ internal class _NSKeyedArchiverUID : NSObject {
3232
return Int(bitPattern: CFHash(_cfObject as CFTypeRef!))
3333
}
3434

35-
open override func isEqual(_ object: AnyObject?) -> Bool {
35+
open override func isEqual(_ object: Any?) -> Bool {
3636
// no need to compare these?
3737
return false
3838
}

Foundation/NSNull.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ open class NSNull : NSObject, NSCopying, NSSecureCoding {
3434
return true
3535
}
3636

37-
open override func isEqual(_ object: AnyObject?) -> Bool {
37+
open override func isEqual(_ object: Any?) -> Bool {
3838
return object is NSNull
3939
}
4040
}

Foundation/NSNumber.swift

+9-4
Original file line numberDiff line numberDiff line change
@@ -209,12 +209,17 @@ open class NSNumber : NSValue {
209209
return Int(bitPattern: CFHash(_cfObject))
210210
}
211211

212-
open override func isEqual(_ object: AnyObject?) -> Bool {
213-
if let number = object as? NSNumber {
212+
open override func isEqual(_ value: Any?) -> Bool {
213+
if let number = value as? Int {
214+
return intValue == number
215+
} else if let number = value as? Double {
216+
return doubleValue == number
217+
} else if let number = value as? Bool {
218+
return boolValue == number
219+
} else if let number = value as? NSNumber {
214220
return CFEqual(_cfObject, number._cfObject)
215-
} else {
216-
return false
217221
}
222+
return false
218223
}
219224

220225
deinit {

Foundation/NSObject.swift

+6-3
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import CoreFoundation
1212

1313
public protocol NSObjectProtocol: class {
1414

15-
func isEqual(_ object: AnyObject?) -> Bool
15+
func isEqual(_ object: Any?) -> Bool
1616
var hash: Int { get }
1717

1818
func `self`() -> Self
@@ -83,8 +83,11 @@ open class NSObject : NSObjectProtocol, Equatable, Hashable {
8383
return self
8484
}
8585

86-
open func isEqual(_ object: AnyObject?) -> Bool {
87-
return object === self
86+
open func isEqual(_ object: Any?) -> Bool {
87+
if let obj = object as? NSObject {
88+
return obj === self
89+
}
90+
return false
8891
}
8992

9093
open var hash: Int {

Foundation/NSOrderedSet.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ open class NSOrderedSet : NSObject, NSCopying, NSMutableCopying, NSSecureCoding,
3232
return true
3333
}
3434

35-
open override func isEqual(_ object: AnyObject?) -> Bool {
35+
open override func isEqual(_ object: Any?) -> Bool {
3636
if let orderedSet = object as? NSOrderedSet {
3737
return isEqual(to: orderedSet)
3838
} else {

Foundation/NSSet.swift

+6-4
Original file line numberDiff line numberDiff line change
@@ -127,11 +127,13 @@ open class NSSet : NSObject, NSCopying, NSMutableCopying, NSSecureCoding, NSCodi
127127
return CFSetGetTypeID()
128128
}
129129

130-
open override func isEqual(_ object: AnyObject?) -> Bool {
131-
guard let otherSet = object as? NSSet else {
132-
return false
130+
open override func isEqual(_ value: Any?) -> Bool {
131+
if let other = value as? Set<AnyHashable> {
132+
return isEqual(to: other)
133+
} else if let other = value as? NSSet {
134+
return isEqual(to: Set._unconditionallyBridgeFromObjectiveC(other))
133135
}
134-
return self.isEqual(to: Set._unconditionallyBridgeFromObjectiveC(otherSet))
136+
return false
135137
}
136138

137139
open override var hash: Int {

Foundation/NSSpecialValue.swift

+8-7
Original file line numberDiff line numberDiff line change
@@ -137,14 +137,15 @@ internal class NSSpecialValue : NSValue {
137137
}
138138
}
139139

140-
override func isEqual(_ object: AnyObject?) -> Bool {
141-
if self === object {
142-
return true
143-
} else if let special = object as? NSSpecialValue {
144-
return _value.isEqual(special._value)
145-
} else {
146-
return false
140+
override func isEqual(_ value: Any?) -> Bool {
141+
if let object = value as? NSObject {
142+
if self === object {
143+
return true
144+
} else if let special = object as? NSSpecialValue {
145+
return _value.isEqual(special._value)
146+
}
147147
}
148+
return false
148149
}
149150

150151
override var hash: Int {

Foundation/NSString.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -303,7 +303,7 @@ open class NSString : NSObject, NSCopying, NSMutableCopying, NSSecureCoding, NSC
303303
return CFStringGetTypeID()
304304
}
305305

306-
open override func isEqual(_ object: AnyObject?) -> Bool {
306+
open override func isEqual(_ object: Any?) -> Bool {
307307
guard let string = (object as? NSString)?._swiftObject else { return false }
308308
return self.isEqual(to: string)
309309
}

Foundation/NSSwiftRuntime.swift

+4-5
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,11 @@ internal class __NSCFType : NSObject {
3232
return Int(bitPattern: CFHash(self))
3333
}
3434

35-
override func isEqual(_ object: AnyObject?) -> Bool {
36-
if let obj = object {
37-
return CFEqual(self, obj)
38-
} else {
39-
return false
35+
override func isEqual(_ value: Any?) -> Bool {
36+
if let other = value as? NSObject {
37+
return CFEqual(self, other)
4038
}
39+
return false
4140
}
4241

4342
override var description: String {

Foundation/NSTimeZone.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ open class NSTimeZone : NSObject, NSCopying, NSSecureCoding, NSCoding {
6363
return Int(bitPattern: CFHash(_cfObject))
6464
}
6565

66-
open override func isEqual(_ object: AnyObject?) -> Bool {
66+
open override func isEqual(_ object: Any?) -> Bool {
6767
if let tz = object as? NSTimeZone {
6868
return isEqual(to: tz._swiftObject)
6969
} else {

Foundation/NSURL.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -256,7 +256,7 @@ open class NSURL : NSObject, NSSecureCoding, NSCopying {
256256
return Int(bitPattern: CFHash(_cfObject))
257257
}
258258

259-
open override func isEqual(_ object: AnyObject?) -> Bool {
259+
open override func isEqual(_ object: Any?) -> Bool {
260260
if let url = object as? NSURL {
261261
return CFEqual(_cfObject, url._cfObject)
262262
} else {

Foundation/NSUUID.swift

+23-6
Original file line numberDiff line numberDiff line change
@@ -82,14 +82,31 @@ open class NSUUID : NSObject, NSCopying, NSSecureCoding, NSCoding {
8282
aCoder.encodeBytes(buffer, length: 16, forKey: "NS.uuidbytes")
8383
}
8484

85-
open override func isEqual(_ object: AnyObject?) -> Bool {
86-
if object === self {
87-
return true
88-
} else if let other = object as? NSUUID {
85+
open override func isEqual(_ value: Any?) -> Bool {
86+
if let other = value as? UUID {
87+
return other.uuid.0 == buffer[0] &&
88+
other.uuid.1 == buffer[1] &&
89+
other.uuid.2 == buffer[2] &&
90+
other.uuid.3 == buffer[3] &&
91+
other.uuid.4 == buffer[4] &&
92+
other.uuid.5 == buffer[5] &&
93+
other.uuid.6 == buffer[6] &&
94+
other.uuid.7 == buffer[7] &&
95+
other.uuid.8 == buffer[8] &&
96+
other.uuid.9 == buffer[9] &&
97+
other.uuid.10 == buffer[10] &&
98+
other.uuid.11 == buffer[11] &&
99+
other.uuid.12 == buffer[12] &&
100+
other.uuid.13 == buffer[13] &&
101+
other.uuid.14 == buffer[14] &&
102+
other.uuid.15 == buffer[15]
103+
} else if let other = value as? NSUUID {
104+
if other === self {
105+
return true
106+
}
89107
return _cf_uuid_compare(buffer, other.buffer) == 0
90-
} else {
91-
return false
92108
}
109+
return false
93110
}
94111

95112
open override var hash: Int {

Foundation/NSValue.swift

+12-11
Original file line numberDiff line numberDiff line change
@@ -51,19 +51,20 @@ open class NSValue : NSObject, NSCopying, NSSecureCoding, NSCoding {
5151
}
5252
}
5353

54-
open override func isEqual(_ object: AnyObject?) -> Bool {
55-
if self === object {
56-
return true
57-
} else if let o = object, type(of: self) == NSValue.self && type(of: o) == NSValue.self {
58-
// bypass _concreteValue accessor in order to avoid acquiring lock twice
59-
let (lhs, rhs) = NSValue.SideTableLock.synchronized {
60-
return (NSValue.SideTable[ObjectIdentifier(self)]!,
61-
NSValue.SideTable[ObjectIdentifier(object!)]!)
54+
open override func isEqual(_ value: Any?) -> Bool {
55+
if let object = value as? NSValue {
56+
if self === object {
57+
return true
58+
} else {
59+
// bypass _concreteValue accessor in order to avoid acquiring lock twice
60+
let (lhs, rhs) = NSValue.SideTableLock.synchronized {
61+
return (NSValue.SideTable[ObjectIdentifier(self)]!,
62+
NSValue.SideTable[ObjectIdentifier(object)]!)
63+
}
64+
return lhs.isEqual(rhs)
6265
}
63-
return lhs.isEqual(rhs)
64-
} else {
65-
return super.isEqual(object)
6666
}
67+
return false
6768
}
6869

6970
open override var description : String {

0 commit comments

Comments
 (0)