์ธ๋ฑ์Šค๋กœ Array ์•„์ดํ…œ์„ ํƒ์ƒ‰ํ•˜๋‹ค๋ณด๋ฉด ํ•ญ์ƒ ๋งˆ์ฃผํ•˜๋Š” ๊ฒƒ์ด ์žˆ๋‹ค. Fatal error: Index out of range. ์ž˜๋ชปํ•˜๋ฉด ๋Ÿฐํƒ€์ž„์— ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋ฐ”๋กœ ์ฃฝ์–ด๋ฒ„๋ฆฌ๊ธฐ ๋งˆ๋ จ์ด๋‹ค. ์•„๋ฌด๋ฆฌ ์—ผ๋‘์— ๋‘”๋‹คํ•˜๋”๋ผ๋„ ์šฐ๋ฆฌ๋Š” ์‚ฌ๋žŒ์ธ ์ด์ƒ ์‹ค์ˆ˜๋ฅผ ํ•˜๊ธฐ ๋งˆ๋ จ์ด๋‹ค.

if index < array.count {
	// ์ž‘์—… ์ˆ˜ํ–‰
}

์ด๋Ÿฐ์‹์œผ๋กœ ๋ฐฉ์–ด์ฝ”๋“œ๋ฅผ ์งœ์ฃผ์–ด์•ผ ํ•˜๋Š”๋ฐ ์—ฌ๊ฐ„ ๊ท€์ฐฎ์€๊ฒŒ ์•„๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ฝ”๋“œ๋„ ๋œ์ด์˜๋‹ค.

Safe

Collection Type์€ indices๋ผ๋Š” ๊ฐ’์„ ๊ฐ€์ง„๋‹ค. ๋‚ด๋ถ€์—๋Š” ์œ ํšจํ•œ ๊ฐ’์˜ ๋ฒ”์œ„๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

์ด๋Ÿฌํ•œ ์ ์„ ๋ฐ”ํƒ•์œผ๋กœ Subscript๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ๋ณด๋‹ค ๊ฐ„๊ฒฐํ•˜๊ณ  ์•ˆ์ „ํ•˜๊ฒŒ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

extension Collection {
    subscript(safe index: Index) -> Iterator.Element? {
        // iOS 9 ์ดํ›„
        guard indices.contains(index) else {
            return nil
        }
        return self[index]
        
        // iOS 8 ์ด์ „ (ํ•˜์œ„ํ˜ธํ™˜)
        // return startIndex <= index && index < endIndex ? self[index] : nil
        // return 0 <= index && index < self.count ? self[index] : nil
    }
}

์ฃผ์˜ํ•  ์ ์€, indices๊ฐ€ iOS9๋ถ€ํ„ฐ ์ง€์›๋˜๊ธฐ ๋•Œ๋ฌธ์—, ํ•˜์œ„ ํ˜ธํ™˜์„ ๋งž์ถ”๊ธฐ ์œ„ํ•ด์„œ๋Š” ์œ„์™€ ๊ฐ™์ด ๋ฐฉ์–ด ์ฝ”๋“œ๋ฅผ ์‚ฝ์ž…ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

Reference