Selaa lähdekoodia

优化UIButton扩展的taskIdentifier字典存储语法 去掉NSMutableDictionary 改为swift标准库字典

lixiang1994 6 vuotta sitten
vanhempi
commit
86771ee4d2
2 muutettua tiedostoa jossa 20 lisäystä ja 32 poistoa
  1. 19 31
      Sources/Extensions/UIButton+Kingfisher.swift
  2. 1 1
      Sources/Utility/Box.swift

+ 19 - 31
Sources/Extensions/UIButton+Kingfisher.swift

@@ -317,27 +317,22 @@ private var imageTaskKey: Void?
 // MARK: Properties
 extension KingfisherWrapper where Base: UIButton {
 
+    private typealias TaskIdentifier = Box<[UInt: Source.Identifier.Value]>
+    
     public func taskIdentifier(for state: UIControl.State) -> Source.Identifier.Value? {
-        return (taskIdentifierInfo[NSNumber(value:state.rawValue)] as? Box<Source.Identifier.Value>)?.value
+        return taskIdentifierInfo.value[state.rawValue]
     }
 
     private func setTaskIdentifier(_ identifier: Source.Identifier.Value?, for state: UIControl.State) {
-        taskIdentifierInfo[NSNumber(value:state.rawValue)] = identifier.map { Box($0) }
+        taskIdentifierInfo.value[state.rawValue] = identifier
     }
     
-    private var taskIdentifierInfo: NSMutableDictionary {
-        get {
-            guard let dictionary: NSMutableDictionary = getAssociatedObject(base, &taskIdentifierKey) else {
-                let dic = NSMutableDictionary()
-                var mutatingSelf = self
-                mutatingSelf.taskIdentifierInfo = dic
-                return dic
-            }
-            return dictionary
-        }
-        set {
-            setRetainedAssociatedObject(base, &taskIdentifierKey, newValue)
-        }
+    private var taskIdentifierInfo: TaskIdentifier {
+        return  getAssociatedObject(base, &taskIdentifierKey) ?? {
+            let value = TaskIdentifier([:])
+            setRetainedAssociatedObject(base, &taskIdentifierKey, value)
+            return value
+        }()
     }
     
     private var imageTask: DownloadTask? {
@@ -352,28 +347,21 @@ private var backgroundImageTaskKey: Void?
 
 // MARK: Background Properties
 extension KingfisherWrapper where Base: UIButton {
-
+    
     public func backgroundTaskIdentifier(for state: UIControl.State) -> Source.Identifier.Value? {
-        return (backgroundTaskIdentifierInfo[NSNumber(value:state.rawValue)] as? Box<Source.Identifier.Value>)?.value
+        return backgroundTaskIdentifierInfo.value[state.rawValue]
     }
     
     private func setBackgroundTaskIdentifier(_ identifier: Source.Identifier.Value?, for state: UIControl.State) {
-        backgroundTaskIdentifierInfo[NSNumber(value:state.rawValue)] = identifier.map { Box($0) }
+        backgroundTaskIdentifierInfo.value[state.rawValue] = identifier
     }
     
-    private var backgroundTaskIdentifierInfo: NSMutableDictionary {
-        get {
-            guard let dictionary: NSMutableDictionary = getAssociatedObject(base, &backgroundTaskIdentifierKey) else {
-                let dic = NSMutableDictionary()
-                var mutatingSelf = self
-                mutatingSelf.backgroundTaskIdentifierInfo = dic
-                return dic
-            }
-            return dictionary
-        }
-        set {
-            setRetainedAssociatedObject(base, &backgroundTaskIdentifierKey, newValue)
-        }
+    private var backgroundTaskIdentifierInfo: TaskIdentifier {
+        return  getAssociatedObject(base, &backgroundTaskIdentifierKey) ?? {
+            let value = TaskIdentifier([:])
+            setRetainedAssociatedObject(base, &backgroundTaskIdentifierKey, value)
+            return value
+        }()
     }
     
     private var backgroundImageTask: DownloadTask? {

+ 1 - 1
Sources/Utility/Box.swift

@@ -26,7 +26,7 @@
 import Foundation
 
 class Box<T> {
-    let value: T
+    var value: T
     
     init(_ value: T) {
         self.value = value