Scala语言规范版本2.8的4.6.2节描述了重复的参数,并说:
参数部分的最后一个值参数可以以"*"为后缀,例如(...,x:T*).然后,方法中的这种重复参数的类型是序列类型scala.Seq [T].
但是,这段代码:
abstract class A { def aSeq : Seq[A] }
class B(val aSeq : A*) extends A
class C extends B { override val aSeq :Seq[A] = Seq() }
Run Code Online (Sandbox Code Playgroud)
编译时出错:
overriding value aSeq in class B of type A*; value aSeq has incompatible type
Run Code Online (Sandbox Code Playgroud)
编译器似乎表明A*是与Seq [A]不同的类型.
在这种情况下调查aSeq的实际类显示它是scala.collection.mutable.WrappedArray $ ofRef的实例,但即使以下代码也无法使用相同的消息进行编译:
class C extends B { override val aSeq = new ofRef(Array[A]()) }
Run Code Online (Sandbox Code Playgroud)
所以问题是,如何覆盖由类上重复参数定义的成员?
如果你想知道它来自何处,那就是exalaly scala.xml.Elem 在scala.xml.Node中覆盖子方法的作用.
我有三个子视图的超级视图.其中两个子视图在superview中的大小和位置都是固定的,但第三个子视图的大小可能因内容而异.
我已经设置了自动布局约束来设置每个子视图的大小和位置,但我想要发生的是当第三个视图的内容发生变化时,superview应该调整大小以便能够完全显示它.
我已经在该子视图上实现了 - (NSSize)intrinsicContentSize,以便它返回它想要的大小,但我无法弄清楚如何添加一个约束来触发superview调整大小.
有任何想法吗?
更新:
我通过向视图添加约束来实现这一点,如下所示:
sizeWidthConstraint = [[NSLayoutConstraint constraintsWithVisualFormat:@"H:[self(==viewWidth)]" options:0 metrics:metrics views:views] lastObject];
sizeHeightConstraint = [[NSLayoutConstraint constraintsWithVisualFormat:@"V:[self(==viewHeight)]" options:0 metrics:metrics views:views] lastObject];
Run Code Online (Sandbox Code Playgroud)
其中"viewWidth"和"viewHeight"是具有所需值的度量字典中的键.在udpateConstraints中,我可以分析我的视图的内容并执行此操作:
[sizeHeightConstraint setConstant: size.height];
[sizeWidthConstraint setConstant: size.width];
Run Code Online (Sandbox Code Playgroud)
设置新值,下一个布局将导致视图的大小调整.
更新panupan的问题更新:
以这种方式创建约束时,可以放入本质上是变量名称的内容.在这种情况下,这些名称是viewWidth和viewHeight.它们被称为约束的常数.您还将称为度量的字典传递给[NSLayoutConstrating constraintsWithVisualFormat:...]调用,该调用为这些常量提供值.
因此,在这种情况下,我从视图的默认高度和宽度开始,作为度量字典键的值viewWidth和viewHeight.稍后,我使用setConstant:方法更改这些值.在上面的示例中,size是我根据视图内容计算的CGSize结构(即基于其子视图的大小),我使用width和height值来调整常量.
这并没有达到我的目的,因为它不会导致我的视图大小根据子视图的内在大小自动重新调整大小,但它确实让我有办法手动重新调整大小.