Extension Array where Element == MyStruct


#1
struct MyStruct {
var high: Double
var low: Double
}

extension Array where Element == MyStruct {

var diff: Double {
return self[?].high - self[?].low
}
}

Как добраться до указанного элемента массива? То есть, например

var myStruct: [MyStruct]
...
myStruct[5].diff

#2

Вы немножко перемудрили.

 myStruct[5] - это не массив, а как раз объект myStruct

Так что можно сделать вот так:

struct MyStruct {
     var high: Double
     var low: Double

     var dif : Double {
        return high - low
     }
}

let arr = [MyStruct(high: 3, low: 4), MyStruct(high: 2, low: 4), MyStruct(high: 3, low: 5),  MyStruct(high: 3, low: 1)]
arr[3].dif

#3

Можно сделать diff переменной в MyStruct, да. Но как быть, если мне нужна computed property, которая для расчета берет данные из указанного элемента массива и предыдущего? Например:

extension Array where Element == MyStruct {

var twoDiff: Double {
return (self[i].high - self[i].low) - (self[i + 1].high - self[i + 1].low) 
}
}

В этом случае я хочу понимать, что выбран был 5 элемент массива (myStruct[5]). И тогда для расчета я возьму 5й и 6й элементы. Но как мне внутри extension получить индекс указанного элемента?


#4
struct MyStruct {
    var high: Double
    var low: Double
}

extension Array where Element == MyStruct {
    subscript(start: Int, space: Int) -> Double {
        let end = start + space
        guard end < endIndex else { fatalError() }
        return self[start..<end].map { $0.high - $0.low }.reduce(0, -)
    }
}

let arr = [
    MyStruct(high: 10, low: 11),
    MyStruct(high: 1, low: 12),
    MyStruct(high: 2, low: 4),
    MyStruct(high: 10, low: 11),
    MyStruct(high: 1, low: 12),
    MyStruct(high: 2, low: 4),
    MyStruct(high: 2, low: 4)
]
let result = arr[5, 1]
print(result)


#5

Возможно ли сделать, чтобы обращаться можно было так: myStruct[5].diff ?


#6

Если только так:

extension ArraySlice where Element == MyStruct {
    var diff: Double {
        return self.map { $0.high - $0.low }.reduce(0, -)
    }
}
let result = arr[5..<6].diff