and*_*ewz 2 uikit swift nslayoutanchor
我试图在NSLayoutAnchor上创建一个扩展方法来接受一个乘数.我得到一个奇怪的Swift编译错误(Swift 3,XCode 8.2.1)不在扩展文件中,而是在相应的.h文件中(该文件由编译器自动生成)用于模块:
@interface NSLayoutAnchor (SWIFT_EXTENSION(MYMODULENAME))
- (NSLayoutConstraint * _Nonnull)constraintTo:(NSLayoutAnchor</* AnchorType */> * _Nonnull)anchor multiplier:(CGFloat)m;
@end
Run Code Online (Sandbox Code Playgroud)
错误指向/* AnchorType */并说:"预期类型".嗯,这是有道理的,因为/* AnchorType */它不是一种类型,而是一种评论.但是我AnchorType在方法签名中使用了type参数.
扩展源代码如下:
extension NSLayoutAnchor {
open func constraint(to anchor: NSLayoutAnchor<AnchorType>, multiplier m: CGFloat) -> NSLayoutConstraint {
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
注意:从Swift 4开始修复,请参阅下面的benrudhart的回答.
目前这是swift和objc的一个问题.在swift中扩展objc泛型,然后不允许桥接到objc.即使添加一个@nonobjc也无法解决问题.请查看此处提交的错误:https://bugs.swift.org/browse/SR-2708了解更多信息.
一个潜在的解决方法是对每种具体类型进行扩展NSLayoutAnchor.具体类型是NSLayoutXAxisAnchor,NSLayoutYAxisAnchor和NSLayoutDimension.
extension NSLayoutDimension {
open func constraint(to anchor: NSLayoutDimension,
multiplier m: CGFloat) -> NSLayoutConstraint
}
extension NSLayoutXAxisAnchor {
open func constraint(to anchor: NSLayoutXAxisAnchor,
multiplier m: CGFloat) -> NSLayoutConstraint
}
extension NSLayoutYAxisAnchor {
open func constraint(to anchor: NSLayoutYAxisAnchor,
multiplier m: CGFloat) -> NSLayoutConstraint
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
500 次 |
| 最近记录: |