swift - 如何在 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!
}
解决方案
请注意,文档清楚地说明了
不要声明新的符合
StringProtocol
. 只有标准库中的String
和Substring
类型是有效的符合类型。
你不应该符合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
,这是您错过的三个要求。如果您声明这些属性,则不需要类型别名。utf16
unicodeScalar
推荐阅读
- python - 如何将图像数据集转换为 pkl 文件
- c# - 将会话中的对象清空会立即将其销毁
- javascript - 使用 Nuxt 2 组合 API 来获取模板 refs 数组
- python - 使用 win32com 实例化并使用用户定义的 vba 对象
- javascript - 如何将用户收到的多个值保存在 localStorage 中?
- firebase - Firebase 从哪个步骤开始按 AB-test 中的变体拆分流量
- c++ - 如何在长时间运行的服务器程序上使用 asan?
- php - Amazon IVS URL 身份验证令牌
- flutter - 当它为空时如何隐藏这个数组符号'[]'?
- ruby-on-rails - 冰糕没有找到“has_many”关联方法