Browse Source

Use the proper setter name for boolean properties.

Mhd Hejazi 5 years ago
parent
commit
ab9a257086
2 changed files with 13 additions and 2 deletions
  1. 8 2
      Sources/Dynamic/Dynamic.swift
  2. 5 0
      Tests/DynamicTests/DynamicTests.swift

+ 8 - 2
Sources/Dynamic/Dynamic.swift

@@ -121,8 +121,14 @@ public class Dynamic: CustomDebugStringConvertible, Loggable {
         let resolved = resolve()
         log(.end)
 
-        let setter = "set" + (name.first?.uppercased() ?? "") + name.dropFirst()
-        Dynamic(resolved, memberName: setter)(value)
+        var setterName: String
+        if name.count > 2, name.hasPrefix("is"), name[name.index(name.startIndex, offsetBy: 2)].isUppercase {
+            setterName = "set" + name.dropFirst(2)
+        } else {
+            setterName = "set" + (name.first?.uppercased() ?? "") + name.dropFirst()
+        }
+
+        Dynamic(resolved, memberName: setterName)(value)
     }
 
     private func callMethod(_ selector: String, with arguments: [Any?] = []) {

+ 5 - 0
Tests/DynamicTests/DynamicTests.swift

@@ -66,6 +66,11 @@ final class DynamicTests: XCTestCase {
         let progress = ObjC.NSProgress.progressWithTotalUnitCount(100)
         progress.completedUnitCount = 50
         XCTAssertEqual(progress.fractionCompleted, 0.5, "Setting numeric properties")
+
+        let queue = ObjC.NSOperationQueue()
+        XCTAssertFalse(queue.isSuspended!)
+        queue.isSuspended = true
+        XCTAssertTrue(queue.isSuspended!, "Setting boolean properties with 'is' prefix")
     }
 
     func testBlocks() {