代码之家  ›  专栏  ›  技术社区  ›  Kodr.F

编译器无法类型检查此表达式swift 4?

  •  16
  • Kodr.F  · 技术社区  · 6 年前

    更新Xcode后,我将此错误写入代码:

    编译器无法在“合理”中键入检查此表达式 时间;尝试将表达式分解为不同的子表达式

    代码:

    //check popup in window frame
    
    let spaceFromLeftSide = cutOutViewX.constant + cutOutViewWidth.constant/2 - (options.textWidth + padding*2)/2
    
    if spaceFromLeftSide < 0{
    
        if options.side == .bottom {
            messageRightSpaceFromBottomDot.constant -= spaceFromLeftSide - padding
        }
        else if options.side == .top{
            messageRightSpaceFromTopDot.constant += spaceFromLeftSide - padding
        }
    }
    
    let spaceFromRightSide = cutOutViewX.constant + cutOutViewWidth.constant/2 + (options.textWidth + padding*2)/2
    
    if spaceFromRightSide > targetView.frame.size.width{
    
        if options.side == .bottom {
            messageRightSpaceFromBottomDot.constant -= spaceFromRightSide - ( targetView.frame.size.width )
        }
        else if options.side == .top{
            messageRightSpaceFromTopDot.constant += spaceFromRightSide - ( targetView.frame.size.width )
        }
    }
    

    线路错误:

    let spaceFromRightSide = cutOutViewX.constant + cutOutViewWidth.constant/2 + (options.textWidth + padding*2)/2
    

    如何解决这个问题?

    5 回复  |  直到 6 年前
        1
  •  30
  •   Ankit Jayaswal    6 年前

    编译器无法在合理的时间内对该表达式进行类型检查;请尝试将该表达式拆分为不同的子表达式。

    当swift编译器发现表达式计算冗长时,会出现此错误。有关详细信息 check here

    要解决这个问题,您只需要将表达式分解为较小的部分。就像:

    let cutOutxOrigin = 3 * cutOutViewX.constant / 2
    let actualPadding = (options.textWidth + padding * 2) / 2
    
    let spaceFromRightSide = cutOutxOrigin + actualPadding
    
        2
  •  5
  •   Milan Nosáľ    6 年前

    只需尝试将表达式分解为几个更简单的子表达式。例如。:

    let halfOfViewWidth = cutOutViewWidth.constant / 2
    let textWidthAndPadding = options.textWidth + (padding * 2)
    let spaceFromRightSide = cutOutViewX.constant + halfOfViewWidth + (textWidthAndPadding / 2)
    
        3
  •  1
  •   Glenn Posadas    6 年前

    所以我有这样的表达:

    return (50 + textHeight) + (dateTextHeight + 16) + (5 + 8) + (16 + 20)
    

    我知道我必须分解或缩短这个表达式以消除错误。也许像:

    return (50 + textHeight) + (dateTextHeight + 16) + 49
    

    尽管它帮助编译器完成了它的工作,但错误的主要原因是可选的int textHeight . 我认为不管你的表达式有多长,它都应该是可编译的。

        4
  •  1
  •   Prashant Tukadiya    6 年前

    我在不同的情况下也遇到过类似的问题

    我试图创建字符串数组

    let selectedData = [
            (data?.nose?.stuffyNose) ?? "",
            (data?.nose?.sinusProblems) ?? "",
            (data?.nose?.hayFever) ?? "",
            (data?.nose?.sneezingAttacks) ?? "",
            (data?.nose?.excessiveMucusFormation) ?? ""
    ] 
    

    我已经加了括号 () 但仍然不起作用。


    为了解决这个问题,我添加了类型 [String]

    let selectedData:[String] = [
            (data?.nose?.stuffyNose) ?? "",
            (data?.nose?.sinusProblems) ?? "",
            (data?.nose?.hayFever) ?? "",
            (data?.nose?.sneezingAttacks) ?? "",
            (data?.nose?.excessiveMucusFormation) ?? ""
    ] 
    

    希望它对面临同样问题的人有帮助

        5
  •  -1
  •   Atif Khan    6 年前

    @Prashant Tukadiya谢谢

    我用了同样的想法,申请了字典,它也起了作用。

    let myDictionary: [String:String] = ["test": "testVal",
                                         "test1": "testVal2",
                                         "test3": "testVal3",
                                         "test4": "testVal4",
                                         "test5": "testVal5",
                                         ]