Чтобы использовать список захвата, вы должны использовать анонимную функцию (которую многие люди ошибочно называют «закрытием»).Таким образом, вы бы переписали ваш
func inner() {
print("bar: \(bar)")
}
как
let inner : () -> () = { [weak bar] in
print("bar: \(bar)")
}