gpt4 book ai didi

swift 协议(protocol) : hiding some properties

转载 作者:搜寻专家 更新时间:2023-10-31 23:00:53 24 4
gpt4 key购买 nike

我想为 UITextViewUITextField 创建一个 trimmedText 属性。这是我所做的:

protocol TrimmedTextSupporting: class {
var _text: String? { get }
var trimmedText: String { get }
}

extension TrimmedTextSupporting {
var trimmedText: String {
let text = self._text ?? ""
return text.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet())
}
}

extension UITextField: TrimmedTextSupporting {

var _text: String? {
return self.text
}
}

extension UITextView: TrimmedTextSupporting {

var _text: String? {
return self.text
}
}

我需要 _text 属性,因为 textUITextField 中被声明为 String?String !UITextView 中(为什么?!>_<)。现在我想隐藏此属性以避免 API 困惑。

这是我尝试过的:

1) 将其标记为private。编译器不允许这样做:'private' modifier cannot be used in protocols

2) 将其分离成私有(private)协议(protocol):

private protocol TextExposing {
var _text: String? { get }
}

extension UITextField: TextExposing {
var _text: String? {
return self.text
}
}

extension UITextView: TextExposing {
var _text: String? {
return self.text
}
}

///////

protocol TrimmedTextSupporting: class {
var trimmedText: String { get }
}

extension UITextField: TrimmedTextSupporting {}

extension UITextView: TrimmedTextSupporting {}

extension TrimmedTextSupporting where Self: TextExposing {

// compiler error
var trimmedText: String {
let text = self._text ?? ""
return text.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet())
}
}

但是编译器再次报错:属性“trimmedText”必须声明为内部,因为它符合内部协议(protocol)“TrimmedTextSupporting”中的要求

我没有想法。

最佳答案

我倾向于:

protocol TrimmedTextSupporting: class {
var trimmedText: String { get }
}

extension TrimmedTextSupporting {

private func trimText(text: String) -> String {
return text.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet())
}
}

extension UITextField: TrimmedTextSupporting {

var trimmedText: String {
return trimText(text ?? "")
}
}

extension UITextView: TrimmedTextSupporting {

var trimmedText: String {
return trimText(text ?? "")
}
}

因此,您通过在共享和私有(private)函数中完成这些工作避免了重复工作,并且 UITextFieldUITextView 上的扩展做了他们需要做的最少工作.

关于 swift 协议(protocol) : hiding some properties,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35604623/

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