Преглед на файлове

[EXC_BAD_ACCESS] Update LayoutConstraint == operator to support iOS 10 and higher changes (#574)

* @sashabelonogov Update LayoutConstraint == operator to support iOS 10 and higher changes

* Simplify return statement of the LayoutConstraint == operator
Alexander Belonogov преди 6 години
родител
ревизия
bc2b0b9332
променени са 2 файла, в които са добавени 43 реда и са изтрити 9 реда
  1. 13 9
      Source/LayoutConstraint.swift
  2. 30 0
      Tests/SnapKitTests/Tests.swift

+ 13 - 9
Source/LayoutConstraint.swift

@@ -44,14 +44,18 @@ public class LayoutConstraint : NSLayoutConstraint {
 }
 
 internal func ==(lhs: LayoutConstraint, rhs: LayoutConstraint) -> Bool {
-    guard lhs.firstItem === rhs.firstItem &&
-          lhs.secondItem === rhs.secondItem &&
-          lhs.firstAttribute == rhs.firstAttribute &&
-          lhs.secondAttribute == rhs.secondAttribute &&
-          lhs.relation == rhs.relation &&
-          lhs.priority == rhs.priority &&
-          lhs.multiplier == rhs.multiplier else {
-        return false
+    let areLayoutAnchorsEqual: Bool
+    if #available(iOS 10.0, OSXApplicationExtension 10.12, *) {
+        areLayoutAnchorsEqual = lhs.firstAnchor === rhs.firstAnchor &&
+            lhs.secondAnchor === rhs.secondAnchor
+    } else {
+        areLayoutAnchorsEqual = lhs.firstItem === rhs.firstItem &&
+            lhs.secondItem === rhs.secondItem &&
+            lhs.firstAttribute == rhs.firstAttribute &&
+            lhs.secondAttribute == rhs.secondAttribute
     }
-    return true
+    return areLayoutAnchorsEqual &&
+        lhs.relation == rhs.relation &&
+        lhs.priority == rhs.priority &&
+        lhs.multiplier == rhs.multiplier
 }

+ 30 - 0
Tests/SnapKitTests/Tests.swift

@@ -580,4 +580,34 @@ class SnapKitTests: XCTestCase {
         let higherPriority: ConstraintPriority = ConstraintPriority.high.advanced(by: 1)
         XCTAssertEqual(higherPriority.value, highPriority.value + 1)
     }
+    
+    func testLayoutConstraintEqual() {
+        let view1 = View()
+        let view2 = View()
+        let layoutConstraint1 = LayoutConstraint(item: view1,
+                                                 attribute: .top,
+                                                 relatedBy: .lessThanOrEqual,
+                                                 toItem: view2,
+                                                 attribute: .bottom,
+                                                 multiplier: 2,
+                                                 constant: 30)
+        let layoutConstraint2 = LayoutConstraint(item: view1,
+                                                 attribute: .top,
+                                                 relatedBy: .lessThanOrEqual,
+                                                 toItem: view2,
+                                                 attribute: .bottom,
+                                                 multiplier: 2,
+                                                 constant: 30)
+        let layoutConstraint3 = LayoutConstraint(item: view1,
+                                                 attribute: .top,
+                                                 relatedBy: .lessThanOrEqual,
+                                                 toItem: view2,
+                                                 attribute: .bottom,
+                                                 multiplier: 1,
+                                                 constant: 50)
+        XCTAssertTrue(layoutConstraint1 == layoutConstraint2)
+        XCTAssertFalse(layoutConstraint1 == layoutConstraint3)
+        XCTAssertFalse(layoutConstraint2 == layoutConstraint3)
+    }
+    
 }