首页 > 解决方案 > 如何在 Swift 中符合 StringProtocol?

问题描述

我想做一个名为CustomStruct的结构,它符合StringProtocol,我开始实现所需的条件,我完成了一半,需要帮助来理解其余部分并完成其余部分,谢谢。

struct CustomStruct: StringProtocol {

    var value: String  // <<: this is my value!
    
    

    typealias UTF8View = <#type#>    // <<: Need help! 
    
    typealias UTF16View = <#type#>    // <<: Need help! 
    
    typealias UnicodeScalarView = <#type#>     // <<: Need help! 
    
    
    mutating func write(_ string: String) {
        value = string    // <<: Done!
    }
    
    func write<Target>(to target: inout Target) where Target : TextOutputStream {
        <#code#>    // <<: Need help! 
    }
    
    var startIndex: String.Index { return value.startIndex }    // <<: Done!
    
    var endIndex: String.Index { return value.endIndex }    // <<: Done!
    
    var description: String { return value }    // <<: Done!

}

标签: swift

解决方案


请注意,文档清楚地说明了

不要声明新的符合StringProtocol. 只有标准库中的StringSubstring类型是有效的符合类型。

你不应该符合StringProtocol.


但是,假设您正在学习如何遵守协议,并且碰巧选择StringProtocol了练习(这是一件非常糟糕的事情,我重复一遍)。

您似乎想通过将所有要求委托给 string 来遵守它value。首先,您没有指定它的所有要求。你还需要:

  • init(_:)
  • init(stringLiteral:)
  • uppercased
  • lowercased
  • utf8
  • utf16
  • unicodeScalars
  • init(decoding:as:)
  • init(decodingCString:as:)
  • init(cString:)
  • withCString(_:)
  • withCString(encodedAs:_:)
  • index(before:)
  • index(after:)
  • subscript(_:)

您可以在文档中找到所有要求。

我不确定您为什么坚持实施write(to:)

func write<Target>(to target: inout Target) where Target : TextOutputStream {
    value.write(to: &target)
}

您也实施write(_:)不正确。write(_:)应该附加到接收器,而不是value完全用参数替换。但同样,在这里做的正确的事情是完全不符合StringProtocol......

例如,我知道什么时候需要描述,但是为什么 typealias UTF8View, typealias 在我的结构中定义后与此无关,为什么我首先需要这些?

这些实际上决定了属性和的类型utf8,这是您错过的三个要求。如果您声明这些属性,则不需要类型别名。utf16unicodeScalar


推荐阅读