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

时间:2018-09-18 08:53:24

标签: ios swift

更新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

该如何解决?

14 个答案:

答案 0 :(得分:40)

  

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

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

要解决此问题,您只需要将表情分成较小的部分即可。就像:

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

let spaceFromRightSide = cutOutxOrigin + actualPadding

答案 1 :(得分:5)

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

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

答案 2 :(得分:2)

所以我有这种表达方式:

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

我知道我必须分解或使该表达式更短才能消除错误。也许像这样:

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

尽管确实足够帮助开发人员完成工作,但错误的主要原因是可选的Int textHeight。我认为无论您的表达多长时间,它都应该是可编译的。

答案 3 :(得分:2)

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

我正在尝试创建字符串数组

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) ?? ""
] 

希望对遇到相同问题的人有帮助

答案 4 :(得分:2)

在使用SwiftUI时,我经常看到此问题,这始终是语法错误的结果。我目前正在使用Xcode 11.4.1,对于支持SwiftUI的早期版本来说确实如此。

例如,由于该错误,我刚刚刻录了50分钟,因为我更改了另一个文件中的函数参数名称。编译器在一个完全未修改的SwiftUI文件中报告了此错误,除了它在不更改参数名称的情况下调用了该函数。与其明确指出参数名称不匹配,是因为此错误。

答案 5 :(得分:1)

当编译器混淆时,会发生此错误。我碰到它做了冗长的计算,混合了各种数字类型

我能够通过将各种子计算转换为CGFloat来对此进行补救。我不需要像一些答案所建议的那样“分解”表达式。

  • 发件人:(一些浮点表达式)* someDouble / someInt
  • 收件人:(某些float表达式)* CGFloat(someDouble / someInt)

答案 6 :(得分:1)

我在 Firebase 上按照文档更新各个键的数据时遇到了这个问题。

// Update Cards
        self.database.collection(FirebaseDatabaseKeys.cards).document(docId).setData([
            "id": docId,
            "cardNumber": card.cardNumber ?? "",
            "isFavorite": card.isFavorite,
            "numberOfCards": card.numberOfCards,
            "playerName": card.playerName?.uppercased() ?? "",
            "year": card.year ?? "",
            "sport": card.sport ?? "",
            "brand": card.brand ?? "",
            "set": card.set ?? "",
            "parallel": card.parallel ?? "",
            "serial": card.serial ?? "",
            "owner": uid ?? "",
            CardSide.frontCard.imageKey: "",
            CardSide.backCard.imageKey: ""
        ]) { err in
            if let error = err {
                print(error.localizedDescription)
            }
        }

我在调用 setData 之前解决了它创建字典

    // Create Data
    let cardData: [String: Any] = [
        "id": docId,
        "cardNumber": card.cardNumber ?? "",
        "isFavorite": card.isFavorite,
        "numberOfCards": card.numberOfCards,
        "playerName": card.playerName?.uppercased() ?? "",
        "year": card.year ?? "",
        "sport": card.sport ?? "",
        "brand": card.brand ?? "",
        "set": card.set ?? "",
        "parallel": card.parallel ?? "",
        "serial": card.serial ?? "",
        "owner": uid ?? "",
        CardSide.frontCard.imageKey: "",
        CardSide.backCard.imageKey: ""
    ]

    // Update Cards
    self.database.collection(FirebaseDatabaseKeys.cards).document(docId).setData(cardData) { err in
        if let error = err {
            print(error.localizedDescription)
        }
    }

答案 7 :(得分:0)

当我不小心混入表达式中的可选内容时,出现了此错误。强制展开后,错误消失了。

   Column1  Column2  clusterID
0       10        2          1
1        1        4          0
2        1        0          0
3        1        2          0
4       10        4          1
5       10        0          1

答案 8 :(得分:0)

这确实是一个内存问题。当我在16GB的计算机上只有350 mb的可用内存时,这件事发生了。使用f.e. CleanMyMac->释放内存可解决此问题。

答案 9 :(得分:0)

只需这样做:

    let array = [Int]()
    let dic   = [Int : Double]()
    
    let tuple = array.map { c -> (a: Int, b: Double) in return (a: c, b: dic[c]!) }.sorted(by: { (first, second) -> Bool in return first.b == second.b ? first.a < second.a : first.b > second.b }).first!

Xcode 11.6花费10秒的CPU时间,以100%的速度运行4个进程,在MacPro 2019上消耗了很多瓦特,我得到了错误消息:表达式分成不同的子表达式)

即使仅将地图和排序组合在一起!

如果我一分为二:

let temporaryTupleArrayToAvoidTheCompilerBug = array.map { c -> (a: Int, b: Double) in return (a: c, b: dic[c]!) }

let tuple = temporaryTupleArrayToAvoidTheCompilerBug.sorted(by: { (first, second) -> Bool in return first.b == second.b ? first.a < second.a : first.b > second.b }).first!

有效。

此错误消息隐藏了错误,编译器可以拆分指令并分别检查方法的语法。

答案 10 :(得分:0)

这件事发生在我身上。我将两个Float传递给一个SwiftUI结构,并从另一个内部减去一个,但是由于错误,我在{Dates内定义了Float(该死,复制粘贴!)。

基本上就是这个。

struct Something: View {
    var minValue: Date
    var maxValue: Date

    var body: some View {
        let valueDifference = maxValue - minValue
    }
}

我这样称呼它:

let minValue: Float = 0
let maxValue: Float = 1

Something(minValue: minValue, maxValue: maxValue)

请注意,我实际上传递了两个Float,但是结构将接受它们,即使它们被定义为Date

Date类型更改为Float后,问题就消失了。

答案 11 :(得分:0)

我有一个表达式,该表达式具有可选变量的几种用法,具有备用值,如下所示:

if ((self.scrollView?.contentSize.width ?? 0.0) > 0.0) && ((self.scrollView?.contentSize.height ?? 0.0) > 0.0) && ((self.scrollView?.frame.size.height ?? 0.0) > 0.0) {

制作变量的非可选副本时,错误消失了:

guard let scrollView = self.scrollView else { return }
if (scrollView.contentSize.width > 0.0) && (scrollView.contentSize.height > 0.0) && (scrollView.frame.size.height > 0.0) {

根据可选变量为nil时要执行的操作,此单行版本也可能有用:

if let scrollView = self.scrollView, (scrollView.contentSize.width > 0.0), (scrollView.contentSize.height > 0.0), (scrollView.frame.size.height > 0.0) {

答案 12 :(得分:0)

我在这里遇到了同样的问题:

@State var sliderpos : CGFloat = (UIScreen.main.bounds.width-32)*(50/100)+(16-20) //causes error

但这另一方面是有效的:

@State var sliderpos : CGFloat = (UIScreen.main.bounds.width-32)*(50/100)-4

答案 13 :(得分:-3)

我遇到了错误,因为我用enum拼接了字符串。

例如:

let url = "/api/" + type

type是一个枚举类型。我解决了

let url = "/api/" + type.rawValue