Ios TextView和TextField的单一扩展,用于添加工具栏

Ios TextView和TextField的单一扩展,用于添加工具栏,ios,swift,uitextfield,uitextview,Ios,Swift,Uitextfield,Uitextview,我想创建一个扩展,在键盘上为TextView和TextField添加一个工具栏 现在我在TextView和TextField上都这样做: extension UITextView { func setKeyboardToolBar(items: [UIBarButtonItem]) { let screenWidth = UIScreen.main.bounds.width let toolBar = UIToolbar(frame: CGRect(x: 0.0, y: 0.0,

我想创建一个扩展,在键盘上为TextView和TextField添加一个工具栏

现在我在TextView和TextField上都这样做:

extension UITextView {
func setKeyboardToolBar(items: [UIBarButtonItem]) {
    let screenWidth = UIScreen.main.bounds.width
    let toolBar = UIToolbar(frame: CGRect(x: 0.0, y: 0.0, width: screenWidth, height: 44.0))
    toolBar.setItems(items, animated: false)
    self.inputAccessoryView = toolBar
}
}

但是,在两个不同的扩展中使用完全相同的函数是很烦人的

我试图像在这个问题中那样扩展UIView,但inputAccessoryView出现错误,因为它是一个get only属性


我如何分解这两个相同的函数?

也许这会帮助您:

extension UITextField: KeyboardToolbarCompatible {}
extension UITextView: KeyboardToolbarCompatible {}

protocol KeyboardToolbarCompatible: AnyObject {
    func setKeyboardToolBar(items: [UIBarButtonItem])
    var inputAccessoryView: UIView? { get set }
}

extension KeyboardToolbarCompatible {
    func setKeyboardToolBar(items: [UIBarButtonItem]) {
        let screenWidth = UIScreen.main.bounds.width
        let toolBar = UIToolbar(frame: CGRect(x: 0.0, y: 0.0, width: screenWidth, height: 44.0))
        toolBar.setItems(items, animated: false)
        self.inputAccessoryView = toolBar
    }
}
如果仅TextView和TextField需要此选项,则KeyboardToolbarCompatible可以确认输入

protocol KeyboardToolbarCompatible: UITextInput { ... }