PhotosPicker(selection: $selectedItem, matching: .videos){
Image(systemName: "camera.fill")
.resizable()
.aspectRatio(contentMode: .fit)
.frame(height: 20)
.padding(2)
}
.onChange(of: selectedItem) { newItem in
videoURL = nil
Task {
if let data = try? await newItem?.loadTransferable(type: Data.self) {
let bytes = Double(data.count)
let megabytes = bytes / (8 * 1024 * 1024)
print("size:")
print(megabytes)
if (megabytes > 32){
print("too big")
}else{
let tempFile = TemporaryMediaFile(withData: data)
let asset = tempFile.avAsset
let vidWidth = await asset?.naturalSize()?.width
let vidHeight = await asset?.naturalSize()?.height
videoHeight = 160 * (vidHeight! / vidWidth!)
videoURL = tempFile.url
}
}else{
print("picking failed")
}
}
}
я получил
Тип выражения неоднозначен без аннотации типа в «Задаче».
Как это исправить?
Затем я получаю «Недопустимое преобразование из генерирующей функции типа '@Sendable () async throws -> Void» в негенерирующую функцию типа '@Sendable () async -> Void'» на .task(id: selectedItem) { Иисус Христос Swift такой отвратительный язык программирования
Измените свой код на это:
PhotosPicker(selection: $selectedItem, matching: .videos) {
Image(systemName: "camera.fill")
.resizable()
.aspectRatio(contentMode: .fit)
.frame(height: 20)
.padding(2)
}
.task(id: selectedItem) {
videoURL = nil
do {
if let data = try await selectedItem?.loadTransferable(type: Data.self) {
let bytes = Double(data.count)
let megabytes = bytes / (8 * 1024 * 1024)
print("size:")
print(megabytes)
if (megabytes > 32) {
print("too big")
} else {
let tempFile = TemporaryMediaFile(withData: data)
let asset = tempFile.avAsset
let vidWidth = await asset?.naturalSize()?.width
let vidHeight = await asset?.naturalSize()?.height
videoHeight = 160 * (vidHeight! / vidWidth!)
videoURL = tempFile.url
}
} else {
print("picking failed")
}
} catch {
print(error)
}
}
вы можете попробовать использовать
selectedItem
напрямую, полностью удалитеnewItem
. Или посмотрите свой предыдущий пост/ответ по адресу: stackoverflow.com/questions/78775085/…