Swift 4 表达式类型 '@value CGRect' 在没有更多上下文的情况下是不明确的。

39

我正在尝试为一个矩形实现模态垂直滑动的动画。然而,当我尝试编译代码时,我会得到以下错误:“Swift 4表达式类型“@value CGRect”在没有更多上下文的情况下是模棱两可的”。我已经将问题隔离到传递给CGRect init值的参数上,但根据苹果的iOS文档,这些参数应该足以指定我需要动画化的“frame”视图。

这是我的代码:

func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
    guard
        let fromView = transitionContext.viewController(forKey: .from),
        let toView = transitionContext.viewController(forKey: .to)

    else {
            return
    }
    let containerView = transitionContext.containerView
    containerView.insertSubview((toView.view)!, belowSubview: (fromView.view)!)

    let toFrame = transitionContext.finalFrame(for: toView)

    let screenBounds = UIScreen.main.bounds

    let bottomLeftCorner = CGPoint(x: 0, y: screenBounds.height)

    let finalFrameForVC = CGRect(origin: bottomLeftCorner, size: screenBounds.size)

    UIView.animate(withDuration: 2, delay: 1,
                   options: [], (using: transitionContext.finalFrame(for: fromView)),
        animations: {
            fromView.view.frame = finalFrameForVC
    },
        completion: { _ in
            transitionContext.completeTransition(!transitionContext.transitionWasCancelled)
    })
}

这个问题属于数据类型,我试图在CGFloat和Int类型之间进行减法运算,后来我将它们转换为相同的类型。例如:width: Int((filterView?.filterTblView.frame.width)!)-Int(width!) - Naresh
13个回答

43

当我尝试将view.frame.height乘以Double时,我遇到了相同的错误。如果您对screenBounds属性进行任何数学计算,请确保类型匹配。


39

我的问题是我试图在一个CGFloat变量和一个Double变量之间执行操作。

解决方案: 将双精度变量转换为CGFloat。检查你的变量类型。

希望这能帮到你!:)


1
这也是我的问题。多么无用的错误信息。 - Greg Hilston
1
和你的一样...解决方案就是将你的“错误”变量放入 CGFloat( HERE ) 中。 - BetterTeng
非常有帮助!在我的情况下,我正在比较CGFloat和CGPoint。 - pallavi

15

我来到这里是为了找出造成错误 "Expression type '@lvalue CGRect' is ambiguous without more context" 的原因,虽然这里没有回答我的问题,但我找到了问题的解决方案,所以我将在这里留下它,供通过 Google 偶然发现此问题的其他人使用。在创建 CGRect 时,请确保明确地将任何不确定的值转换为 CGFloat(例如,var width = CGFloat(100)),而不是依赖编译器为您推断正确的类型/转换。


1
或者您可以先设置本地变量,然后将其作为参数放入函数中。结果-没有错误。 let viewWidth = view.bounds.width let viewHeight = view.bounds.heightscrollView.contentSize = CGSize(width: viewWidth, height: viewHeight) - Vitya Shurapov

9

这是XCode 10.1中的一个错误,我即将报告这个问题。

let myHeight = CGFloat(100)

myHeight -= myView.frame.height

这会产生错误:

"表达式类型'@lvalue CGRect'在没有更多上下文的情况下是模棱两可的"

错误是错误的,问题在于myHeight是一个常量。

苹果有任何回应吗? - Hudi Ilfeld

5
对我来说,我将Int作为CGRect高度

Xcode错误地将此错误指向了y

表达式类型'@value CGRect'在没有更多上下文的情况下是模棱两可的

enter image description here

解决方案

只需将高度隐式定义为CGFloat

let height:CGFloat = 100

@YogeshPatel,那么投赞成票就是合适的 ;) - Husam

4

您遇到的异常不是由于 finalFrameForVC,而是由于 fromView.view.frame 引起的 "'@value CGRect' is ambiguous without more context"。

通过将 fromView.view 明确声明为 UIView 来解决此问题:

UIView.animate(withDuration: 2, delay: 1, options: [], animations: {
      let view: UIView = fromView.view
      view.frame = finalFrameForVC as! CGRect
    }) { _ in
      transitionContext.completeTransition(!transitionContext.transitionWasCancelled)
    }

2
是的,我知道,但编译器要求您指定它是一个UIView。我不知道为什么 :( - vmeyer
1
这对我有用,谢谢!当Xcode说“表达式过于复杂”时,这并不是一个罕见的错误,你需要将其分解成有意义的部分。 - rommex

2

问题出在您的动画调用上,

  1. 代码书写有误
  2. 方法不存在

重新排版后:

UIView.animate(
   withDuration: 2,
   delay: 1,
   options: [],
   (using: transitionContext.finalFrame(for: fromView)),
   animations: {
     fromView.view.frame = finalFrameForVC
   },
   completion: { _ in            
     transitionContext.completeTransition(!transitionContext.transitionWasCancelled)
   }
)

请注意(using: transitionContext.finalFrame(for: fromView))。您不能将方法的一部分放在括号中,包括一个外部参数名称,它必须是:

UIView.animate(
   withDuration: 2,
   delay: 1,
   options: [],
   using: transitionContext.finalFrame(for: fromView),
   animations: {
     fromView.view.frame = finalFrameForVC
   },
   completion: { _ in            
     transitionContext.completeTransition(!transitionContext.transitionWasCancelled)
   }
)

那就是导致错误的原因。但是,using: 部分中也没有动画方法,因此我认为这只是一个复制粘贴错误,实际上你想要的只是:
UIView.animate(
   withDuration: 2,
   delay: 1,
   options: [],
   animations: {
     fromView.view.frame = finalFrameForVC
   },
   completion: { _ in            
     transitionContext.completeTransition(!transitionContext.transitionWasCancelled)
   }
)

1

我刚刚也遇到了同样的问题,我是这样解决的:

enter image description here

就像上面的例子一样:self.view必须赋值给另一个变量,并且视图应该强制转换为view!,然后编译将成功运行。


2
请不要发布代码截图,而是使用代码标签来发布您的代码。 - Ali

1

真的很傻的n00b答案,我遇到了同样的问题

"表达式类型'@lvalue CGRect'在没有更多上下文的情况下是模棱两可的"

这是因为我在CGFloat之前按下了return。请检查确保它在同一行上。希望这能帮助某些人。


0

我在尝试创建一个CGRect时遇到了这个错误,因为我忘记在NSLayoutConstraint的变量名末尾添加.constant


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接