1

我正在编写一个待办事项列表应用程序,这是我的代码:

struct TaskItem: View {
@State var task : Task
@Environment(\.presentationMode) var presentationMode: Binding<PresentationMode>
@EnvironmentObject var taskData: UserData
@ObservedObject private var keyboard = KeyboardResponder()
var body: some View {
    Form{
        Section(header: Text("Details").font(.headline)){
            HStack{

                TextField("Title", text: $task.title ).font(Font.headline)

            }
            TextField("Description", text: $task.description)
                .font(Font.body)
        }
        Section{
            Toggle("Mark as Done", isOn: $task.isDone)
        }
        Section{
            Picker(selection: $task.priority, label: Text("priority")) {
                Text("very important").tag(2)
                Text("important").tag(1)
                Text("need to do").tag(0)
            }.pickerStyle(SegmentedPickerStyle()).padding(5)
        }
    }
    .padding(.bottom, keyboard.currentHeight)
    .edgesIgnoringSafeArea(.bottom)
    .animation(.easeOut(duration: 0.16))
    .navigationBarItems(trailing: Button(action: {
        //save data
        var result :[Task]
        result = save(id: self.task.id,
                      creationDate: self.task.creationDate,
                      creationDateYear: self.task.creationDateYear,
                      creationDateMonth: self.task.creationDateMonth,
                      creationDateDay: self.task.creationDateDay,
                      dueDate: self.task.dueDate,
                      time: self.task.time,
                      title: self.task.title,
                      description: self.task.description,
                      priority: self.task.priority,
                      isDone: self.task.isDone, taskData: self.taskData.taskData)
        self.taskData.taskData = result
        self.presentationMode.wrappedValue.dismiss()
    }, label:{
        Text("save")
    }))
    // here I put my save code
}

}

当按下保存按钮时,任务的 var 被保存。我想删除保存按钮并在更改值后自动保存数据。当我将 // save data code 块从 save 按钮函数移到 var body 中时,我得到“函数声明了一个不透明的返回类型,但在其主体中没有返回语句来推断底层类型”错误。

enter code here

在此处输入图像描述

4

1 回答 1

0
var body: some View {
    Form {
    .....
    }
}

是你现在拥有的。这正是预期的结果!

Form {
    .....
}

没有别的,只是SwiftUI.Form 的构造函数

return语句可以省略,因为它只有一个表达式

var body: some View {
    let somtething = ....
    Form {
        ....
    }
}

是错的。为什么?错误信息解释得很清楚。"函数声明了一个不透明的返回类型,但它的主体中没有返回语句来推断基础类型"

这部分错误消息“函数声明”有点不清楚,直到你考虑一下,Swift中的函数和闭包有什么区别。

var body: some View {
    ....
}

可以重写为func语句

func body()-> some View {
    ...
}

也许,有一天,编译器的错误信息会更清楚......

如果你真的喜欢,你可以做

var body: some View {
    let somtething = ....
    return Form {
        ....
    }
}

我最好避免这种情况。为了更好的可读性和易于维护您的代码,请将所有逻辑放入您的模型中。使用 SwiftUI 的设计目的并利用其声明性语法。

于 2020-02-07T20:54:42.693 回答