TL; DR: Как изменить содержимое внутри структуры ForEach
?
Ниже приведена отдельная игровая площадка, в которой вызов frame()
в порядке на простом body
метод, но является синтаксической ошибкой при переносе в ZStack/ForEach
l oop.
import UIKit
import SwiftUI
struct Item: Identifiable {
var id = UUID()
var name: String
init(_ name:String) { self.name = name }
}
let items = [
Item("a"), Item("b"), Item("c")
]
struct ContentView: View {
var body: some View {
return Image("imageName")
.resizable()
.frame(width:0, height:0) // This compiles.
}
var body2: some View {
ZStack {
ForEach(items) { item -> Image in // Return type required...
let i = item // ...because of this line.
return Image(i.name)
.resizable() // Parens required.
.frame(width: 0, height: 0) // Compile error.
}
}
}
}
Обратите внимание на строку let i = item
. Он поддерживает код в моем приложении, который выполняет некоторые вычисления. Тот факт, что ForEach
замыкание не является одиночным выражением , привело к тому, что компилятор пожаловался
Невозможно определить тип возврата сложного замыкания; добавить явный тип для устранения неоднозначности.
, что побудило меня добавить тип возвращаемого значения. Но , что вызывает топи c этого вопроса, ошибка компилятора:
Невозможно преобразовать возвращаемое выражение типа 'some View' в возвращаемый тип 'Image'
Похоже, что возвращаемое значение вызова frame()
не Image
, а ModifiedContent<SwiftUI.Image, SwiftUI._FrameLayout>
.
Я обнаружил (благодаря комментаторам!) Я могу обойти это, (каким-то образом) сократив замыкание ForEach
до одного выражения, что делает выводным тип возвращаемого значения, который я затем могу удалить. Это мой единственный выход?