gpt4 book ai didi

ios - Swift 中 UI 元素的通用 `getText()` 函数

转载 作者:行者123 更新时间:2023-11-28 10:43:18 26 4
gpt4 key购买 nike

对于很多 Action ,我需要检查label.texttextView.texttextField.text等内容. 为零。

所以我创建了一些扩展:

extension UILabel {
func getText() -> String {
return self.text ?? ""
}
}

extension UITextField {
func getText() -> String {
return self.text ?? ""
}
}

extension UITextView {
func getText() -> String {
return self.text ?? ""
}
}

扩展非常多余。类似的情况是当我需要将 IntDoubleFloat 等转换为另一种数字格式时。我想要的是一个简单的 toInt(),当出现问题时返回 -10

那么如何为 toString()toInt() 创建一个通用函数呢?我读到了 extensionsgenerics在 Apple 文档中,但我没有看到我的问题的解决方案。

最后,我尝试用相同的扩展名扩展 UIView,因为它是 UILabel 等的父类(super class),但我无法调用 getText()

那么创建通用扩展的好方法是什么?

最佳答案

这里有一些可疑的事情:我不想要任何 toInt()函数在出错时只返回 -1 或 0。 Swift 有一个很好的可选系统是有原因的,返回 -1 或 0 会引入几个明显的陷阱。我也不知道你打算如何实现 getText()。在 UIView 上.许多 View 没有文本。我不知道这个实现意味着什么或做什么。

所以我将忽略这两个细节并专注于主要问题,这似乎是您的扩展的冗余。有一种更简洁的方法,即通过协议(protocol)扩展来减少重复。

protocol TextProviding {
var text: String? { get }
}

extension TextProviding {
// Following your example here. I would prefer calling
// this a `var textOrEmpty: String` but same idea.
func getText() -> String {
return text ?? ""
}
}

// To conform additional types, you just need 1 line
extension UILabel: TextProviding { }
extension UITextField: TextProviding { }

编辑:正如一些人指出的那样,将上述代码与 extension UITextView: TextProviding { } 一起使用不会工作,因为 UITextViewtextString! , 不是 String? .不幸的是,这意味着如果你想让它也适用于 UITextView,你应该重命名 var text对其他东西的要求(这意味着您将需要几行额外的代码来手动符合 UILabelUITextField )。

protocol TextProviding {
var string: String? { get }
}

extension TextProviding {
var stringOrEmpty: String {
return string ?? ""
}
}

extension UILabel: TextProviding {
var string: String? { return text }
}
extension UITextField: TextProviding {
var string: String? { return text }
}
extension UITextView: TextProviding {
var string: String? { return text }
}

关于ios - Swift 中 UI 元素的通用 `getText()` 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49536268/

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