Swift protocol is very interesting yet very weird. Sometimes it behaves very strangely. import Foundation protocol Command {} struct TLDRCommand: Command {} // Works func getOk() -> [Command] { return [TLDRCommand(), TLDRCommand(), TLDRCommand()] } // Does not work func getFail() -> [Command] { let myArray = [TLDRCommand(), TLDRCommand(), TLDRCommand()] return myArray } // Casting also does not work func getFail2() -> [Command] { let myArray = [TLDRCommand(), TLDRCommand(), TLDRCommand()] return myArray as [Command] } // This works, no complain about RHS not being the type of LHS func getOk2() -> [Command] { let myArray: [Command] = [TLDRCommand(), TLDRCommand(), TLDRCommand()] return myArray } // And this also this works func getOk3() -> [Command] { var myArray: [Command] = [] myArray.append(TLDRCommand()) myArray.append(TLDRCommand()) return myArray }