更新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
该如何解决?
答案 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来对此进行补救。我不需要像一些答案所建议的那样“分解”表达式。
答案 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