약속
protocol SoccerTeam {
var striker: String { get set }
var midfielder: String { get set }
var defender: String { get set }
var goalKeeper: String { get set }
func play(sports: String) -> String {
}
}
protocol SoccerTeam {
var striker: String { get }
}
class ATeam: SoccerTeam {
let striker: String = "Kim"
}
class BTeam: SoccerTeam {
var striker: String = "Kim"
}
class ATeam: SoccerTeam {
var random: String = ""
var striker: String {
get {
return "kim"
}
}
}
class BTeam: SoccerTeam {
var random: String = ""
var striker: String {
get {
return "kim"
}
set {
self.random = newValue
}
}
}
protocol SoccerTeam {
var striker: String { get set }
}
class ATeam: SoccerTeam {
var striker: String = "Kim"
}
class BTeam: SoccerTeam {
var random: String = ""
var striker: String {
get {
return "kim"
}
set {
self.random = newValue
}
}
}
class ManUtd: SoccerTeam {
var striker: String = "A"
var midfielder: String = "B"
var defender: String = "C"
var goalKeeper: String = "D"
func play(sports: String) -> String {
return "Soccer"
}
}
protocol SoccerTeam {
var striker: String { get set }
var midfielder: String { get set }
var defender: String { get set }
@objc optional goalKeeper: String { get set }
func play() {
print("축구하자"
}
}
그러나, 이럴 경우 채택하는 타입은 struct이면 안된다! 무조건 class로! objc이 붙으면 objective-c에서 사용이 가능하다라는 뜻인데, objective-c에서는 무조건 class만 프로토콜 채택이 가능하다. 또한 자연스럽게 protocol은 AnyObject을 채택하게 된다.
protocol SoccerTeam {
var striker: String { get }
}
let manUtd: SoccerTeam
struct ATeam: SoccerTeam {
var striker: String = "KIM"
var midfielder: String = "LEE"
}
타입캐스팅
이 가능하다. 따라서 아래와 같이 코드를 작성할 수 있다.let manUtd: SoccerTeam = ATeam.init()
fun doSomething(soccerTeam: SoccerTeam) -> SoccerTeam {
return ATeam.init()
}
SoccerTeam
을 채택하는 여러 개의 struct
이 존재하는데, 모든 struct
이 play
함수를 구현할 때에 동일하게 구현한다면?struct
에서 동일한 작업을 반복해주어야된다.protocol SoccerTeam {
fun play()
}
// 같은 함수 play()인데, 각 struct마다 반복적으로 구현해주어야된다. => 비효율적!
struct ATeam: SoccerTeam {
func play() {
print("play")
}
}
struct BTeam: SoccerTeam {
func play() {
print("play")
}
}
protocol SoccerTeam {
fun play()
}
extension SoccerTeam {
fun play() {
print("play")
}
}
protocol SoccerTeam {
associatedtype value
func attack(value: value)
func defence() -> value
}
protocol SoccerTeam {
associatedtype value: Equatable
func attack(value: value)
func defence() -> value
}
struct ManUtd: SoccerTeam {
typealias value = Int
func attack(value: value) { }
func defence() -> value { ... }
}
struct ManUtd: SoccerTeam {
func attack(value: Int) { }
func defence() -> Int { ... }
}
protocol SoccerTeam {
func attack<T: Equatable>(value: T)
}