Generic types can gain methods only when their type arguments meet a constraint.

Add behavior for one element type

constrained_extensions.swift
extension Array where Element == Int {
    func total() -> Int {
        var sum = 0
        for value in self {
            sum += value
        }
        return sum
    }
}

let bonus = 
let scores = [2, 4, bonus]
let total = scores.total()
let message = "total=\(total)"

print(message)
extension Array where Element == Int {
    func total() -> Int {
        var sum = 0
        for value in self {
            sum += value
        }
        return sum
    }
}

let bonus = 
let scores = [2, 4, bonus]
let total = scores.total()
let message = "total=\(total)"

print(message)
extension Array where Element == Int {
    func total() -> Int {
        var sum = 0
        for value in self {
            sum += value
        }
        return sum
    }
}

let bonus = 
let scores = [2, 4, bonus]
let total = scores.total()
let message = "total=\(total)"

print(message)
constrained extension A constrained extension keeps specialized behavior available only for matching generic instantiations.