fix: accessing optional properties through reflection (#204)
This commit is contained in:
@@ -20,6 +20,7 @@
|
|||||||
- Fixed checking dictionary values for nil in `default` filter
|
- Fixed checking dictionary values for nil in `default` filter
|
||||||
- Fixed comparing string variables with string literals, in Swift 4 string literals became `Substring` and thus couldn't be directly compared to strings.
|
- Fixed comparing string variables with string literals, in Swift 4 string literals became `Substring` and thus couldn't be directly compared to strings.
|
||||||
- Integer literals now resolve into Int values, not Float
|
- Integer literals now resolve into Int values, not Float
|
||||||
|
- Fixed accessing properties of optional properties via reflection
|
||||||
|
|
||||||
|
|
||||||
## 0.10.1
|
## 0.10.1
|
||||||
|
|||||||
@@ -187,11 +187,33 @@ extension Mirror {
|
|||||||
if result == nil {
|
if result == nil {
|
||||||
// go through inheritance chain to reach superclass properties
|
// go through inheritance chain to reach superclass properties
|
||||||
return superclassMirror?.getValue(for: key)
|
return superclassMirror?.getValue(for: key)
|
||||||
} else if let result = result, String(describing: result) == "nil" {
|
} else if let result = result {
|
||||||
// mirror returns non-nil value even for nil-containing properties
|
guard String(describing: result) != "nil" else {
|
||||||
// so we have to check if its value is actually nil or not
|
// mirror returns non-nil value even for nil-containing properties
|
||||||
return nil
|
// so we have to check if its value is actually nil or not
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
if let result = (result as? AnyOptional)?.wrapped {
|
||||||
|
return result
|
||||||
|
} else {
|
||||||
|
return result
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protocol AnyOptional {
|
||||||
|
var wrapped: Any? { get }
|
||||||
|
}
|
||||||
|
|
||||||
|
extension Optional: AnyOptional {
|
||||||
|
var wrapped: Any? {
|
||||||
|
switch self {
|
||||||
|
case let .some(value): return value
|
||||||
|
case .none: return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ fileprivate class WebSite {
|
|||||||
|
|
||||||
fileprivate class Blog: WebSite {
|
fileprivate class Blog: WebSite {
|
||||||
let articles: [Article] = [Article(author: Person(name: "Kyle"))]
|
let articles: [Article] = [Article(author: Person(name: "Kyle"))]
|
||||||
|
let featuring: Article? = Article(author: Person(name: "Jhon"))
|
||||||
}
|
}
|
||||||
|
|
||||||
func testVariable() {
|
func testVariable() {
|
||||||
@@ -160,5 +161,11 @@ func testVariable() {
|
|||||||
try expect(result) == "blog.com"
|
try expect(result) == "blog.com"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$0.it("can resolve optional variable property using reflection") {
|
||||||
|
let variable = Variable("blog.featuring.author.name")
|
||||||
|
let result = try variable.resolve(context) as? String
|
||||||
|
try expect(result) == "Jhon"
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user