( , identifier : ), , [Instruments], () Instrument , . . ( @Hamish !):
struct Instrument {
let identifier: String
var changeThis: Int
init(_ identifier: String, _ changeThis: Int) {
self.identifier = identifier
self.changeThis = changeThis
}
}
struct Foo {
var instruments: [Instrument]
@discardableResult
mutating func updateInstrument(forFirst identifier: String,
using mutate: (inout Instrument) -> ()) -> Bool {
if let idx = instruments.indices
.first(where: { instruments[$0].identifier == identifier }) {
mutate(&instruments[idx])
return true
}
return false
}
}
:
var foo = Foo(instruments:
[Instrument("a", 1), Instrument("b", 2),
Instrument("c", 3), Instrument("b", 4)])
if foo.updateInstrument(forFirst: "b", using: { $0.changeThis = 42 }) {
print("Successfully mutated an instrument")
}
foo.updateInstrument(forFirst: "c", using: { $0.changeThis = 99 })
print(foo.instruments)
@Owen: s answer, index(where:) ( indices.first(where:), ). index(where:)
if let idx = instruments.indices
.first(where: { instruments[$0].identifier == identifier }) { ...
if let idx = instruments
.index(where: { $0.identifier == identifier }) { ...
updateInstrument(forFirst:using) Foo.
updateInstrument(forFirst:using), map Optional () :
struct Foo {
var instruments: [Instrument]
@discardableResult
mutating func updateInstrument(forFirst identifier: String,
using mutate: (inout Instrument) -> ()) -> Bool {
return instruments
.index(where: { $0.identifier == identifier })
.map { mutate(&instruments[$0]) } != nil
}
}