Как уже указывалось, вы можете использовать first(where:)
, например ::
func findARoom(named room: String) -> Room? {
return rooms.first { $0.roomName == room }
}
Но вы сказали:
Я хочу иметь возможность вызывать функцию findARoom()
таким же образом, но не выполнять итерацию по всему массиву.
К сожалению, first(where:)
выполняет цикл for
. Просто посмотрите на исходный код для этого метода. Это все еще O (n), как и ваша собственная реализация.
Если вы говорили, что просто не хотите писать свой собственный цикл for
, то first
(или тому подобное) - это просто более краткий способ написать то же самое, но понимайте, что это не более эффективен, чем ваш подход.
Если вы действительно хотите насладиться хэшированным исполнением, вы можете создать словарь:
let rooms: [Room] = ...
let dictionary = Dictionary(grouping: rooms, by: { $0.roomName })
Полученный dictionary
является [String: [Room]]
.
Теперь, когда вы ищите комнату в этом dictionary
, вы наслаждаетесь хешированными клавишами:
if let room = dictionary["Study Room"]?.first { ... }
ИМХО, эта словарная структура не будет стоить этого в таком приложении, и first(where:)
- действительно хорошее, краткое решение. Но если вы действительно не хотите, чтобы он был зациклен и действительно нуждался в производительности O (1), вы должны знать, что first
этого не достигнет.