Компилятор не может ввести проверку этого выражения swift 4?

После обновления 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

как это исправить?

Ответ 1

Компилятор не может ввести проверку этого выражения в разумные сроки; попробуйте разбить выражение на отдельные подвыражения

Эта ошибка появляется, когда быстрый компилятор находит вычисление выражения длинным. Подробнее здесь.

Чтобы решить эту проблему, вам просто нужно разбить свое выражение на более мелкие части. Как:

let cutOutxOrigin = 3 * cutOutViewX.constant / 2
let actualPadding = (options.textWidth + padding * 2) / 2

let spaceFromRightSide = cutOutxOrigin + actualPadding

Ответ 2

Просто попробуйте разбить выражение на несколько более простых подвыражений. Например:

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

Ответ 3

Итак, у меня есть такое выражение:

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

Я знал, что мне нужно разбить или сделать это выражение короче, чтобы избавиться от ошибки. Вроде бы возможно:

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

Хотя это достаточно верно, это помогло компилятору выполнить свою работу, основной причиной ошибки является необязательный Int textHeight. Я думаю, независимо от того, как долго ваше выражение, оно должно быть компилируемым.

Ответ 4

Я столкнулся с похожей проблемой с другим сценарием

Я пытался создать массив строк

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

Вот еще один нелепый пример:

return 

Ответ 6

У меня была эта ошибка, когда я случайно смешал необязательное в выражении. После распаковки ошибка исчезла.

let a : String = "A" 
let b : String = "B" 
let c = letterDictionary["C"]

let imageName : String = a + b + c //error 
let imageName : String = a + b + c! //no error 

Ответ 7

@Prashant Тукадия спасибо

Я использовал ту же идею и применил к словарю, и это сработало

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

Ответ 8

Это действительно проблема с памятью. Это случилось со мной, когда на моей машине объемом 16 ГБ у меня только 350 МБ свободной памяти. Используя f.e. CleanMyMac → Освободить память решил эту проблему.