实现 CaseIterable Swift 4 的 String 枚举扩展
Extension for String enum implementing CaseIterable Swift 4
来自 swift 4 枚举中的 CaseIterable 协议让我的生活更快乐,但我想知道我是否可以为枚举创建扩展 Type:String,CaseIterable.
到目前为止,我可以像这样创建枚举字符串扩展:
extension RawRepresentable where RawValue == String{
func toCorrectFormatSring()->String{
var returnedString = self.rawValue
returnedString = returnedString.uppercased()
return returnedString
}
}
但我有一些具有共同功能的枚举,我不想在所有枚举中重复它。该函数以逗号分隔的字符串形式给出所有情况,它看起来像这样:
enum Vehicle:String,CaseIterable{
case car
case truck
static func getStringList()->String{
let aArray = self.allCases
var returnedString = ""
for aItem in aArray{
returnedString += "\(aItem.toCorrectFormatSring())\(aItem == aArray.last ? "":",")"
}
return returnedString
}
}
我想在扩展中使用的函数是 getStringList。可能吗?
输出
[CAR,TRUCK]
您可能想要这样的东西:
extension RawRepresentable where RawValue == String {
func toCorrectFormat() -> String {
let returnedString = // whatever
return returnedString
}
}
extension CaseIterable where Self : RawRepresentable, Self.RawValue == String {
static func getStringList() -> String {
let aArray = Array(self.allCases)
var returnedString = ""
if let last = aArray.last {
for aItem in aArray{
returnedString += "\(aItem.toCorrectFormat())\(aItem == last ? "" : ",")"
}
}
return returnedString
}
}
现在你可以开始了,因为协议扩展将所需的静态函数注入到枚举中:
enum E : String, CaseIterable {
case howdy
case byebye
}
let s = E.getStringList()
既然你知道如何注入所需的功能,你可以用更好的方式重写 getStringList
(循环很愚蠢,与 last
的比较是错误的,并且字符串插值是不必要的)。我想你真正想要的是这样的:
extension CaseIterable where Self : RawRepresentable, Self.RawValue == String {
static func getStringList() -> String {
return Array(self.allCases)
.map{[=12=].rawValue.uppercased()}
.joined(separator:",")
}
}
来自 swift 4 枚举中的 CaseIterable 协议让我的生活更快乐,但我想知道我是否可以为枚举创建扩展 Type:String,CaseIterable.
到目前为止,我可以像这样创建枚举字符串扩展:
extension RawRepresentable where RawValue == String{
func toCorrectFormatSring()->String{
var returnedString = self.rawValue
returnedString = returnedString.uppercased()
return returnedString
}
}
但我有一些具有共同功能的枚举,我不想在所有枚举中重复它。该函数以逗号分隔的字符串形式给出所有情况,它看起来像这样:
enum Vehicle:String,CaseIterable{
case car
case truck
static func getStringList()->String{
let aArray = self.allCases
var returnedString = ""
for aItem in aArray{
returnedString += "\(aItem.toCorrectFormatSring())\(aItem == aArray.last ? "":",")"
}
return returnedString
}
}
我想在扩展中使用的函数是 getStringList。可能吗?
输出
[CAR,TRUCK]
您可能想要这样的东西:
extension RawRepresentable where RawValue == String {
func toCorrectFormat() -> String {
let returnedString = // whatever
return returnedString
}
}
extension CaseIterable where Self : RawRepresentable, Self.RawValue == String {
static func getStringList() -> String {
let aArray = Array(self.allCases)
var returnedString = ""
if let last = aArray.last {
for aItem in aArray{
returnedString += "\(aItem.toCorrectFormat())\(aItem == last ? "" : ",")"
}
}
return returnedString
}
}
现在你可以开始了,因为协议扩展将所需的静态函数注入到枚举中:
enum E : String, CaseIterable {
case howdy
case byebye
}
let s = E.getStringList()
既然你知道如何注入所需的功能,你可以用更好的方式重写 getStringList
(循环很愚蠢,与 last
的比较是错误的,并且字符串插值是不必要的)。我想你真正想要的是这样的:
extension CaseIterable where Self : RawRepresentable, Self.RawValue == String {
static func getStringList() -> String {
return Array(self.allCases)
.map{[=12=].rawValue.uppercased()}
.joined(separator:",")
}
}