我的课程看起来像这样
class test: UIView {
var value: Float
override func drawRect(rect: CGRect) {
self.addSubview(getSlider())
self.addSubview(getLabel())
}
override init(frame: CGRect) {
value = 0.9
super.init(frame:frame)
}
func getSlider()-> UISlider {
let slider: UISlider = UISlider(frame: CGRectMake(10,10,self.frame.width,30))
slider.addTarget(self, action:"change", forControlEvents:UIControlEvents.ValueChanged)
return slider
}
func getLabel()-> UILabel {
let label = UILabel(frame: CGRectMake(10,50,50,50))
label.text = "\(value)"
return label
}
func change(sender: UISlider) {
value = sender.value
}
我有这方面的实现,例如
trait Value[T] {
def get:T
}
问题是我需要为这些类型创建jsonFormat才能将它保存到MongoDB。
我坚持了两天,但仍然无法弄清楚如何让它发挥作用
答案 0 :(得分:4)
对于为Reads
(泛型类型)返回Option
的提供的.nullable
,您需要首先强制Value
的类型参数本身提供了所需的Reads
和Writes
的实例。
因此,对于通用Reads[Value[T]]
,最小def
将如下所示。
def valueReads[T](implicit underlying: Reads[T]): Reads[Value[T]] = ???
类似地,对于Writes[Value[T]]
(或OWrites
,如果它需要限制为JSON对象,因此BSON文档),最小定义将如下。
def valueWrites[T](implicit underlying: Writes[T]): Writes[Value[T]] = ???
// or
def valueOWrites[T](implicit underlying: Writes[T]): OWrites[Value[T]] = ??? // don't define both as implicit to avoid conflict
然后,实现取决于您希望将Value[T]
表示为JSON的方式。
考虑以下JSON表示:
{ "_value": ... }
...然后Reads
会像下面那样。
implicit def valueReads[T](implicit underlying: Reads[T]): Reads[Value[T]] =
Reads[Value[T]] { json =>
(json \ "_value").validate(underlying).map { t: T =>
Value(t)
}
}
类似地,OWrites[Value[T]]
将如下。
implicit def valueWrites[T](implicit underlying: Writes[T]): OWrites[Value[T]] =
OWrites[Value[T]] { value => Json.obj("_value" -> value) }
显然,这些含义必须在隐式范围内,或者通过在
Value
伴随对象中定义,或者在其他地方定义时显式导入。