gpt4 book ai didi

ios - 输出到 UITextField 或 UILabel 的通用函数

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

我正在尝试在 Swift 2 中为 iOS 编写一个函数,该函数处理一些文本并将其写入 UITextField UILabel .目前,我有以下工作:

@IBOutlet weak var textField: UITextField!
@IBOutlet weak var textLabal: UILabel!

​func writeSomeText(string: String, toOutput: UITextField) {
// do some text processing
toOutput.text = // processed string
}

​func writeSomeText(string: String, toOutput: UILabel) {
// do some text processing
toOutput.text = // processed string
}

如您所见,现在我正在重载该函数,本质上是为 UITextField 和 UILabel 复制它,并且由于我有一堆完全相同的文本处理,所以我正在复制代码。

有没有什么方法可以使用泛型编写一个函数来通过一个函数定义来实现这一点?

最佳答案

试试看这个方法...

import UIKit

protocol P {
func foo(str: String)->String
}
extension P {
func foo(str: String)->String {
// do some processing
let res = str
return res
}
}
extension UILabel:P {
func bar(str: String) {
self.text = foo(str)
}
}
extension UITextField:P {
func bar(str: String) {
self.text = foo(str)
}
}

let l = UILabel()
l.text = "alfa"
l.bar("ALFA")

let t = UITextField()
t.text = "beta"
t.bar("BETA")

print(l.text, t.text) // Optional("ALFA") Optional("BETA")

顺便说一下,你根本不需要协议(protocol) P :-),它只是作为一个“命名空间”存在(没有全局 func foo)

另一种方法是定义一些通用协议(protocol)并扩展 UILabel 和 UITextField

import UIKit

protocol P: class {
var text: String? {get set}
}

extension UILabel: P {}
extension UITextField: P {}

func writeSomeText<T:P>(string: String, toOutput: T ){
// do some text processing
toOutput.text = string
}

let l = UILabel()
writeSomeText("label", toOutput: l)
l.text // "label"

let tv = UITextView()
tv.text = "text"
// but
writeSomeText("text view", toOutput: tv) // error: cannot invoke 'writeSomeText' with an argument list of type '(String, toOutput: UITextView)'

以后你可以用文本属性扩展其他类,如果你想......而不改变 func writeSomeText 的实现

关于ios - 输出到 UITextField 或 UILabel 的通用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34882746/

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