컴파일러가 이 표현식 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
이것을 어떻게 고칠까요?
컴파일러가 적절한 시간 내에 이 표현식을 유형 검사할 수 없습니다. 표현식을 별도의 하위 표현식으로 분할해 보십시오.
이 오류는 swift 컴파일러가 식 계산이 길다고 판단할 때 나타납니다.자세한 내용은 여기를 참조하십시오.
이 문제를 해결하려면, 여러분은 여러분의 표현을 더 작은 부분으로 나누기만 하면 됩니다.다음과 같습니다.
let cutOutxOrigin = 3 * cutOutViewX.constant / 2
let actualPadding = (options.textWidth + padding * 2) / 2
let spaceFromRightSide = cutOutxOrigin + actualPadding
다른 시나리오에서도 비슷한 문제에 직면한 적이 있습니다.
문자열 배열을 생성하려고 했습니다.
let selectedData = [
(data?.nose?.stuffyNose) ?? "",
(data?.nose?.sinusProblems) ?? "",
(data?.nose?.hayFever) ?? "",
(data?.nose?.sneezingAttacks) ?? "",
(data?.nose?.excessiveMucusFormation) ?? ""
]
이미 Brackets()를 추가했지만 작동하지 않았습니다.
이 문제를 해결하기 위해 유형을 추가했습니다.[String]
let selectedData:[String] = [
(data?.nose?.stuffyNose) ?? "",
(data?.nose?.sinusProblems) ?? "",
(data?.nose?.hayFever) ?? "",
(data?.nose?.sneezingAttacks) ?? "",
(data?.nose?.excessiveMucusFormation) ?? ""
]
같은 문제에 직면한 사람에게 도움이 되기를 바랍니다.
표현식을 몇 가지 간단한 하위 표현식으로 구분해 보십시오.예:
let halfOfViewWidth = cutOutViewWidth.constant / 2
let textWidthAndPadding = options.textWidth + (padding * 2)
let spaceFromRightSide = cutOutViewX.constant + halfOfViewWidth + (textWidthAndPadding / 2)
편집
인 유형 변환을 유형의 할 수 것을 ▁a▁that▁to▁multip예▁i▁compiler▁by▁convers▁of▁also▁relyinge▁infer▁explicit▁typeions▁i▁providing▁(▁the▁this▁by나▁on▁that▁noticed는▁type▁fix▁able▁to▁instead▁of대명▁error신(추g시▁was,다는하론곱을니습것CGFloatInt그것은 결과를 낳아야 합니다.CGFloat나는 명시적으로 변환했습니다.IntCGFloat 유형 및문제가 것 .) 문제는 실제로 유형과 자동 유형 추론 및 확인에 있는 것 같습니다.복잡한 표현식을 작은 부분으로 나누는 것은 가독성에 매우 유용할 수 있지만, 유형에 대해 명시적으로 설명함으로써 문제를 해결할 수 있습니다(오류 메시지는 기본적으로 컴파일러가 유형 검사를 수행할 수 없음을 나타냄). 따라서 가능한 한 명시적인 유형을 제공함으로써 도움이 될 수 있습니다.
제가 실수로 식에 선택사항을 섞었을 때 이 오류가 발생했습니다.강제로 포장을 뜯은 후 오류가 사라졌습니다.
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
그래서 저는 다음과 같은 표현을 합니다.
return (50 + textHeight) + (dateTextHeight + 16) + (5 + 8) + (16 + 20)
오류를 제거하기 위해 이 표현을 깨거나 짧게 만들어야 한다는 것을 알고 있었습니다.예를 들어:
return (50 + textHeight) + (dateTextHeight + 16) + 49
제 할 수 이지만, 은 선택 인 Int 컴일러가제수기데되입도었다지니만는움이선인오택적, 류의주원인 Int은파요입니다.textHeight당신의 표현이 아무리 길어도 컴파일이 가능해야 한다고 생각합니다.
Swift와 함께 작업할 때 이 문제가 자주 발생합니다.UI는 항상 구문 오류의 결과입니다.현재 Xcode 11.4.1을 사용하고 있으며, Swift를 지원하는 이전 버전의 경우에도 마찬가지였습니다.UI.
예를 들어, 다른 파일에서 함수 매개 변수의 이름을 변경했기 때문에 이 오류로 인해 50분이 걸렸습니다.컴파일러가 Swift에서 이 오류를 보고했습니다.변경된 매개 변수 이름 없이 함수를 호출한 것을 제외하고는 완전히 변경되지 않은 UI 파일입니다.매개 변수 이름 불일치를 명시적으로 지적하는 대신 이 오류로 인해 오류가 발생합니다.
이 오류는 컴파일러가 혼동될 때 발생합니다.다양한 숫자 유형을 혼합하는 긴 계산을 하다가 우연히 마주쳤습니다.
저는 CGFloat에 다양한 하위 계산을 캐스팅하여 이를 해결할 수 있었습니다.저는 몇몇 대답들이 제안한 것처럼 표현을 "헤어질" 필요가 없었습니다.
- 보낸이: (일부 부동 표현식) * 일부 이중 / 일부인트
- 받는 사람: (일부 부동 표현식) * CGFloat(일부 이중 / 일부 Int)
저도 같은 문제가 있었습니다.
@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
이런 일이 저에게 일어났습니다.나는 두 개를 지나고 있었습니다.FloatSwiftUI구조를 만들고 내부의 다른 것에서 하나를 빼지만, 실수로 나는 정의했습니다.Floatas Dates 내부(빌어먹을, 복사 붙여넣기!).
그것은 기본적으로 이것이었습니다.
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문제가 사라졌습니다.
지금까지 두 가지 사례가 있었습니다.
- 바인딩이 필요한 뷰를 환경 개체를 사용하는 뷰로 변경했지만 MyView($binding) 대신 MyView($binding)에 대한 호출이 있었습니다.완전히 다른 관점에서 이 오류가 발생했습니다.저는 가장 복잡한 코드(7개의 다른 뷰가 있는 스위치 문)를 주석 처리했고 컴파일러는 문제를 발견했습니다.
뭔가를 시도했지만, 마음에 들지 않았고, 혼란에 빠졌고, 오류를 일으켰습니다.문제를 선택 해제하는 대신 모든 변경 사항을 삭제했습니다. 실행되고 정상적으로 빌드되었음에도 오류가 지속되었습니다.빌드 폴더를 치료했습니다. 오류가 발생하지 않았습니다.컴퓨터를 절전 모드로 보냈습니다. 오류가 다시 발생했습니다.빌드 폴더를 다시 정리했습니다. 오류가 사라졌습니다(및 프로젝트 빌드됨).컴파일러는 분명히 혼란스럽습니다. 이것이 지속되면 Apple에 프로젝트를 보냅니다.추가적인 관찰은 그것이 잘 빌드되고 실행되고, 컴파일러가 나중에 만족하고, 그것에 대해 생각하고, 그리고 나서 오류를 던지며, 이것은 프로젝트의 실행 능력에 영향을 미치지 않는다는 것을 말해줍니다.
그를 잡은 것 같아요.프로젝트에 뷰를 몇 개 더 추가했는데(현재는 뷰 계층에 추가하지 않고 조용히 앉아 있음) 오류가 영구적으로 발생했습니다.그래서 오류가 표시된 파일을 다시 보고 그룹 없이도 할 수 있다고 판단했습니다.그 이후로, 저는 그 오류를 다시 보지 못했습니다.
이것은 정말로 기억력 문제입니다.제가 16GB 컴퓨터에 350MB의 사용 가능한 메모리만 있을 때 이런 일이 일어났습니다.F.E.를 사용합니다.CleanMyMac -> 메모리를 확보하여 이 문제를 해결했습니다.
단순히 그렇게 함으로써:
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은 MacPro 2019에서 100%로 많은 와트를 소비하는 4개의 프로세스로 10초의 CPU를 사용하며 오류를 받았습니다. (컴파일러는 이 표현식을 합리적인 시간 내에 유형 검사할 수 없습니다. 표현식을 구별되는 하위 표현식으로 분할해 보십시오.)
지도와 정렬만 결합해도!
만약 내가 2로 갈라진다면:
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!
그건 효과가 있다.
오류 메시지는 버그를 숨기기 위해 여기에 있습니다. 컴파일러는 명령어를 분할하고 메서드 구문을 별도로 확인할 수 있습니다.
다음과 같은 폴백 값과 함께 선택적 변수를 여러 번 사용하는 표현식이 있었습니다.
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) {
옵션 변수가 0인 경우 수행할 작업에 따라 이 한 줄 버전도 유용할 수 있습니다.
if let scrollView = self.scrollView, (scrollView.contentSize.width > 0.0), (scrollView.contentSize.height > 0.0), (scrollView.frame.size.height > 0.0) {
설명서에 따라 개별 키의 데이터를 업데이트할 때 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)
}
}
한 가지 가능한 경우는 열거형 문자열을 분사하는 것입니다.
예:
enum Fruit: String {
case apple
}
let fruit = Fruit.apple
그러면 오류가 발생합니다.
let url = "/api/" + fruit
과일은Enuma가 아닌 필드String나는 결정합니다.
let url = "/api/" + fruit.rawValue
언급URL : https://stackoverflow.com/questions/52382645/the-compiler-is-unable-to-type-check-this-expression-swift-4
'programing' 카테고리의 다른 글
| MySQL InnoDB: 기본 키가 아닌 자동 증분 (0) | 2023.09.03 |
|---|---|
| SqlCommand를 재사용하시겠습니까? (0) | 2023.09.03 |
| 팬더의 이동 열 데이터 프레임이 하나씩 증가합니까? (0) | 2023.09.03 |
| IntelliJ: 기호 '스프링 프레임워크'를 확인할 수 없습니다. (0) | 2023.09.03 |
| JavaScript 및 jQuery를 사용한 크로스 브라우저 키 누르기 이벤트(F1-F12) 처리 (0) | 2023.09.03 |