5

trimmedTextと のプロパティを作成したいと思いUITextViewますUITextField。これが私がしたことです:

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
  }
}

が as inおよび as inとして宣言されて_textいるため、プロパティが必要です(なぜyyy?! >_<)。ここで、API が煩雑にならないように、このプロパティを非表示にしたいと思います。textString?UITextFieldString!UITextView

これが私が試したことです:

1) としてマークしprivateます。コンパイラはこれを許可しません:'private' modifier cannot be used in protocols

2) プライベート プロトコルに分離する:

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())
  }
}

しかし、コンパイラは再び不平を言います: Property 'trimmedText' must be declared internal because it matches a requirement in internal protocol 'TrimmedTextSupporting'

私はアイデアがありません。

4

3 に答える 3

4

私は一緒に行きたいと思います:

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 ?? "")
    }
}

したがって、共有関数と非公開関数で行うことで、ハードワークの重複を回避し、拡張機能をオンUITextFieldUITextViewして、必要最小限のことを行います。

于 2016-02-24T14:31:32.567 に答える
-1

または、trimmedText を必須ではなく、オプションに設定することもできます。

(Swift でオプションを使用する場合は、プロトコルを @objc にする必要があります)

@objc protocol TrimmedTextSupporting: class {
     optional var trimmedText: String { get }
}
于 2016-02-24T14:42:03.680 に答える