gpt4 book ai didi

swift - 具有动态返回类型的表单输入

转载 作者:行者123 更新时间:2023-11-30 12:05:28 25 4
gpt4 key购买 nike

我想开发一个动态表单输入,可能只是一个 UITextField 或 UIDatePicker。表单输入应使用类型(枚举)进行初始化,因此根据初始化的类型返回 String 或 Date。也许稍后我想添加更具体的类型返回其他东西。

使用 Swift 4 执行此操作的最佳实践是什么?您将在哪里存储数据(例如名字、姓氏、出生日期)?在 Controller 中?泛型类型是一个可能的解决方案吗?

Cheerio

编辑10月18日

感谢用户Palle的支持!最终的解决方案看起来像这样:

FormItem.swift

// enum with types for inputs
enum FormItemType: Int {
case text = 0
case date = 1
}

// enum with types of values
enum FormInputValue {
case text(String)
case date(Date)
}

// FormItem holds value, label and input
class FormItem: UIView {
var value: FormInputValue?
var label: FormLabel?
var input: FormInput?
}

表单输入.swift

// Protocol to delegate the change to the controller
protocol FormInputDelegate: NSObjectProtocol {
func inputDidChange(value: FormInputValue)
}

// FormInput holds the actual input
class FormInput: UIView {

var formInput: FormInput?
var delegate: FormInputDelegate?

// Init FormInput with type and optional value
convenience init(type: FormItemType, value: FormInputValue?) {
switch type {
case .text(let text)?:
self.initTextInput(label: label, value: text)
break
case .date(let date)?:
self.initDateInput(label: label, value: date)
break
case .none:
break;
}
}

// Init specific String input field
fileprivate func initTextInput (label: String, value: String?) {
formInput = FormTextInput(label: label, value: value)
self.addSubview(formInput!)
}

// Init specific Date input field
fileprivate func initDateInput (label: String, value: Date?) {
formInput = FormDateInput(label: label, value: value)
self.addSubview(formInput!)
}
}

FormTextInput.swift

// Init actual input with label and optional value
convenience init(label: String, value: String?) {
[...]
}

CreateViewController.swift

// Create View Controller where FormInputs 
class CreateViewController: UIViewController {

var firstname: String = "Test 123"

// Init view controller and add FormItem
convenience init() {
let fistnameFormItem = FormItem(type: .text, label: NSLocalizedString("Input.Label.Firstname", comment: ""), value: FormInputValue.text(firstname))
}
}

最佳答案

我会使用单独的输入而不是一个动态输入。

如果您确实想要通用输入,则可以使用具有关联值的枚举作为其值:

enum FormInputResult {
case date(Date)
case name(firstName: String, lastName: String)
}

在模型- View - Controller 架构中,姓名和生日等数据应存储在数据模型中。 Controller 应该充当模型和 View 之间的中介。

关于swift - 具有动态返回类型的表单输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46726951/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com