【发布时间】:2018-05-09 14:05:20
【问题描述】:
我创建了一个包含所有可选属性的类。我正在尝试创建一个计算的var,它返回对象的所有非零属性。
[<array of stuff>].flatMap{ $0 } 似乎是显而易见的选择,但是当我在 Playground 中对其进行修改时,它仍然返回一个包含 nil 值的数组。
以下是我尝试获取类的非零属性数组的各种迭代:
假设我这样声明我的对象:
let lastSearch = LastSearch(startDate: startDate, endDate: endDate, minMagnitude: 1.0, maxMagnitude: 5.0, minLongitude: nil, maxLongitude: nil, minLatitude: nil, maxLatitude: nil, minDepth: nil, maxDepth: nil)
尝试 #1:
在我的课堂上,我正在尝试创建一个 nonNilProperties 计算变量:
var nonNilProperties: Any {
return [startDate, endDate, minMagnitude, maxMagnitude, minLongitude, maxLongitude, minLatitude, maxLatitude, minDepth , maxDepth].flatMap{ $0 } as Any
}
这是我打印 lastSearch.nonNilProperties 时在控制台中打印的内容:
[Optional(2015-10-01 13:23:32 +0000), Optional(2015-10-07 01:43:59 +0000), Optional(1.0), Optional(5.0), nil, nil, nil, nil, nil, nil]
尝试 #2:
如果我在每个属性后添加as Any,它会消除编译器警告,并且填充的值不会在它们前面打印“可选”,但它仍然有null 值:
var nonNilProperties: Any {
return [startDate as Any, endDate as Any, minMagnitude as Any, maxMagnitude as Any, minLongitude as Any, maxLongitude as Any, minLatitude as Any, maxLatitude as Any, minDepth as Any, maxDepth as Any].flatMap{ $0 } as [AnyObject]
}
这是我打印时在控制台中打印的内容:
[2015-10-01 13:23:32 +0000, 2015-10-07 01:43:59 +0000, 1, 5, <null>, <null>, <null>, <null>, <null>, <null>]
感谢您的阅读。我欢迎你的建议。下面是这个类的样子:
class LastSearch {
private var startDate: Date?
private var endDate: Date?
private var minMagnitude: Double?
private var maxMagnitude: Double?
private var minLongitude: Double?
private var maxLongitude: Double?
private var minLatitude: Double?
private var maxLatitude: Double?
private var minDepth: Double?
private var maxDepth: Double?
private var nonNilProperties: Any {
return [startDate as Any, endDate as Any, minMagnitude as Any, maxMagnitude as Any, minLongitude as Any, maxLongitude as Any, minLatitude as Any, maxLatitude as Any, minDepth as Any, maxDepth as Any].flatMap{ $0 } as Any
}
init(startDate: Date?, endDate: Date?,
minMagnitude: Double?, maxMagnitude: Double?,
minLongitude: Double?, maxLongitude: Double?,
minLatitude: Double?, maxLatitude: Double?,
minDepth: Double?, maxDepth: Double?) {
// Dates
self.startDate = startDate
self.endDate = endDate
// Magnitude Values
self.minMagnitude = minMagnitude
self.maxMagnitude = maxMagnitude
// Geographic Coordinates
self.minLongitude = minLongitude
self.maxLongitude = maxLongitude
self.minLatitude = minLatitude
self.maxLatitude = maxLatitude
// Depth Values
self.minDepth = minDepth
self.maxDepth = maxDepth
}
}
【问题讨论】:
-
为什么要创建一个所有属性都可能为零的类?您确定需要将它们全部设为可选项吗?
-
如果没有初始化属性之一,该类将永远不会被初始化。我正在使用班级在班级之间进行簿记。它有一些我没有在这里发布的方法。
-
顺便说一句,您如何知道要使用数组中的哪些元素以及如何识别它们是哪些?我认为这没有用。
-
@LeoDabus 我想了一个办法,认为它超出了这个问题的范围。
-
另一种方法
return ((Mirror(reflecting: self).children.map { $0.value } as [Any]) as [Any?]).flatMap { $0 }
标签: ios swift computed-properties