@@ -34,44 +34,6 @@ internal let NSPropertyListClasses : [AnyClass] = [
34
34
NSNumber . self
35
35
]
36
36
37
- // NSUniqueObject is a wrapper that allows both hashable and non-hashable objects
38
- // to be used as keys in a dictionary
39
- internal struct NSUniqueObject : Hashable {
40
- var _backing : Any
41
- var _hashValue : ( ) -> Int
42
- var _equality : ( Any ) -> Bool
43
-
44
- init < T: Hashable > ( hashableObject: T ) {
45
- self . _backing = hashableObject
46
- self . _hashValue = { hashableObject. hashValue }
47
- self . _equality = {
48
- if let other = $0 as? T {
49
- return hashableObject == other
50
- }
51
- return false
52
- }
53
- }
54
-
55
- init ( _ object: Any ) {
56
- // FIXME can't we check for Hashable directly?
57
- if let ns = object as? NSObject {
58
- self . init ( hashableObject: ns)
59
- } else if let ah = object as? AnyHashable {
60
- self . init ( hashableObject: ah)
61
- } else {
62
- fatalError ( " Non-object, non-hashable type used as key " )
63
- }
64
- }
65
-
66
- var hashValue : Int {
67
- return _hashValue ( )
68
- }
69
- }
70
-
71
- internal func == ( x : NSUniqueObject , y : NSUniqueObject ) -> Bool {
72
- return x. _equality ( y. _backing)
73
- }
74
-
75
37
open class NSKeyedArchiver : NSCoder {
76
38
struct ArchiverFlags : OptionSet {
77
39
let rawValue : UInt
@@ -99,8 +61,8 @@ open class NSKeyedArchiver : NSCoder {
99
61
private var _flags = ArchiverFlags ( rawValue: 0 )
100
62
private var _containers : Array < EncodingContext > = [ EncodingContext ( ) ]
101
63
private var _objects : Array < Any > = [ NSKeyedArchiveNullObjectReferenceName]
102
- private var _objRefMap : Dictionary < NSUniqueObject , UInt32 > = [ : ]
103
- private var _replacementMap : Dictionary < NSUniqueObject , Any > = [ : ]
64
+ private var _objRefMap : Dictionary < AnyHashable , UInt32 > = [ : ]
65
+ private var _replacementMap : Dictionary < AnyHashable , Any > = [ : ]
104
66
private var _classNameMap : Dictionary < String , String > = [ : ]
105
67
private var _classes : Dictionary < String , _NSKeyedArchiverUID > = [ : ]
106
68
private var _cache : Array < _NSKeyedArchiverUID > = [ ]
@@ -309,17 +271,15 @@ open class NSKeyedArchiver : NSCoder {
309
271
return NSKeyedArchiveNullObjectReference
310
272
}
311
273
312
- let oid = NSUniqueObject ( objv!)
313
-
314
- uid = self . _objRefMap [ oid]
274
+ uid = self . _objRefMap [ objv as! AnyHashable ]
315
275
if uid == nil {
316
276
if conditional {
317
277
return nil // object has not been unconditionally encoded
318
278
}
319
279
320
280
uid = UInt32 ( self . _objects. count)
321
281
322
- self . _objRefMap [ oid ] = uid
282
+ self . _objRefMap [ objv as! AnyHashable ] = uid
323
283
self . _objects. insert ( NSKeyedArchiveNullObjectReferenceName, at: Int ( uid!) )
324
284
}
325
285
@@ -333,9 +293,7 @@ open class NSKeyedArchiver : NSCoder {
333
293
if objv == nil {
334
294
return true // always have a null reference
335
295
} else {
336
- let oid = NSUniqueObject ( objv!)
337
-
338
- return self . _objRefMap [ oid] != nil
296
+ return self . _objRefMap [ objv as! AnyHashable ] != nil
339
297
}
340
298
}
341
299
@@ -403,13 +361,11 @@ open class NSKeyedArchiver : NSCoder {
403
361
Update replacement object mapping
404
362
*/
405
363
private func replaceObject( _ object: Any , withObject replacement: Any ? ) {
406
- let oid = NSUniqueObject ( object)
407
-
408
364
if let unwrappedDelegate = self . delegate {
409
- unwrappedDelegate. archiver ( self , willReplace: object, with: replacement)
365
+ unwrappedDelegate. archiver ( self , willReplace: object as! AnyHashable , with: replacement)
410
366
}
411
367
412
- self . _replacementMap [ oid ] = replacement
368
+ self . _replacementMap [ object as! AnyHashable ] = replacement
413
369
}
414
370
415
371
/**
@@ -514,7 +470,7 @@ open class NSKeyedArchiver : NSCoder {
514
470
}
515
471
516
472
// check replacement cache
517
- objectToEncode = self . _replacementMap [ NSUniqueObject ( object! ) ]
473
+ objectToEncode = self . _replacementMap [ object as! AnyHashable ]
518
474
if objectToEncode != nil {
519
475
return objectToEncode
520
476
}
0 commit comments