我制定了一个协议
protocol IndexConvertable{
associatedtype T
static func convertAnyTypeToInt(_ type: Self) -> Int
static func convertIntToAnyType(_ int: Int) -> Self
}
协议允许我索引一个具有无限双向值的类型,例如Date
例如
extension Date: IndexConvertable{
typealias T = Date
static func convertAnyTypeToInt(_ date: Date) -> Int {
date.convertDateToInt()
}
static func convertIntToAnyType(_ int: Int) -> Date {
int.convertIntToDate()
}
}
extension Date{
/// This function converts a Date to an Int.
func convertDateToInt(){
...
}
}
extension Int{
/// This function converts an Int to a Date.
func convertIntToDate{
...
}
}
从逻辑上讲,任何数组元素类型相同的数组都可以通过循环给定的值转换为双向无穷序列。
例一:
let colors: [Color] = [.red, .blue, .purple]
goal => [... .red, .blue, .purple, .red, .blue, .purple ...]
例二:
struct ColorView: View{
let color: Color
var body: some View{
color.ignoreSafeArea()
}
}
let colorViews: [ColorView] = [
ColorView(color: .red),
ColorView(color: .blue),
ColorView(color: .purple)
]
=> [... ColorView(color: .red), ColorView(color: .blue), ColorView(color: .purple), ColorView(color: .red), ColorView(color: .blue), ColorView(color: .purple) ...]
换算计算:
let c: [Color] = [.red, .blue, .purple]
| x|-5个|-4个|-3个|-2个|-1人|无|1个|第二章|三个|四个|五个|
| - ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|
| c[y]|c[1]|c[2]|c[0]|c[1]|c[2]|c[0]|c[1]|c[2]|c[0]|c[1]|c[2]|
| | .蓝色|.紫色|红色|.蓝色|.紫色|红色|.蓝色|.紫色|红色|.蓝色|.紫色|
let count = c.count
//Formula
y = { //if x is positive
if x >= 0{
x % count
}else{ //if x is negative
((x % count) + count) % count
}
}()
该公式适用于长度不同的数组。
任何数组元素类型相同的数组,都可以通过循环给定的值转换为双向无穷序列。
我不想为数组中包含的每一个类型编写扩展。
我怎样才能达到要求?或者任何达到同样目的的方法都是受欢迎的.
2条答案
按热度按时间2j4z5cfb1#
你有两个不相关的问题。这是第二个问题的答案:
Algorithms提供
cycled
。如果它不适合您的需要,izkcnapc2#
您可以基于泛型类型约束扩展,因此可以执行如下操作
使用它的示例