νλ‘ν μ½(Protocols)
- μ΄λ€ κΈ°λ₯μ νμν μꡬμ¬νμ μ μΈν΄λλ κ²
- ν΄λμ€, ꡬ쑰체, μ΄κ±°νμ μν΄ μ±ν
νλ‘ν μ½ λ¬Έλ²
protocol SomeProtocol {
// protocol definition
}
νλ‘ν μ½μ λ°λ₯΄λ νμ μ μ μνκΈ° μν΄μλ νμ μ΄λ¦ λ€μ μ½λ‘ (:)μ λΆμ΄κ³ νλ‘ν μ½ μ΄λ¦μ μ μ
νλ‘ν μ½μ μ±νν λλ νλ‘ν μ½μ μ μλ μꡬμ¬νμ λ°λμ ꡬν ν΄μΌλ§ ν¨
struct SomeStructure: FirstProtocol, AnotherProtocol {
// structure definition goes here
}
class SomeClass: SomeSuperclass, FirstProtocol, AnotherProtocol {
// class definition goes here
}
νλ‘ν μ½ μꡬμ¬ν μ μ
νλ‘νΌν° μꡬμ¬ν
- νλ‘νΌν°μ μ΄λ¦κ³Ό νμ κ·Έλ¦¬κ³ gettable, settable νμ§ λͺ μν΄μΌ ν¨
- μ°μ° νλ‘νΌν°λ νμ varλ‘ μ μΈν΄μΌν¨(μ μ₯ νλ‘νΌν°λ gettable λ§ κ°λ₯ν κ²½μ°μλ letμΌλ‘ μ μΈ κ°λ₯), νμ νλ‘νΌν°λ static ν€μλ μ¬μ©
protocol SomeProtocol {
var mustBeSettable: Int { get set }
var doesNotNeedToBeSettable: Int { get }
static var someTypeProperty: Int { get set }
}
λ©μλ μꡬμ¬ν
- νμ μΈμ€ν΄μ€ λ©μλμ νμ λ©μλ λͺ μ κ°λ₯
- λ©μλ νλΌλ―Έν°μ κΈ°λ³Έκ°μ μ¬μ© λΆκ°
protocol SomeProtocol {
static func someTypeMethod()
func random() -> Double
}
λ³κ²½ κ°λ₯ν λ©μλ μꡬμ¬ν
- mutating ν€μλλ₯Ό μ¬μ©ν΄ μΈμ€ν΄μ€μμ λ³κ²½ κ°λ₯νλ€λ κ²μ νμ
- mutating ν€μλλ κ° νμ μμλ§ μ¬μ©
protocol Togglable {
mutating func toggle()
}
μ΄κΈ°μ μꡬμ¬ν
- νλ‘ν μ½μμ νμλ‘ κ΅¬νν΄μΌνλ μ΄λμ λΌμ΄μ μ§μ κ°λ₯
- ꡬνν λ μ΄λμ λΌμ΄μ μμ required ν€μλλ₯Ό λΆμ¬μ€μΌν¨
protocol SomeProtocol {
init(someParameter: Int)
}
class SomeClass: SomeProtocol {
required init(someParameter: Int) {
// initializer implementation goes here
}
}
- νλ‘ν μ½μ μ±ννκ³ ν΄λμ€λ₯Ό μμλ°λ κ²½μ° μ΄λμ λΌμ΄μ μμ required ν€μλμ override ν€μλλ₯Ό μ μ΄μΌν¨
protocol SomeProtocol {
init()
}
class SomeSuperClass {
init() {
// initializer implementation goes here
}
}
class SomeSubClass: SomeSuperClass, SomeProtocol {
// "required" from SomeProtocol conformance; "override" from SomeSuperClass
required override init() {
// initializer implementation goes here
}
}
νμ μΌλ‘μ¨μ νλ‘ν μ½
νλ‘ν μ½λ νμ μΌλ‘ μ¬μ©κ°λ₯
- ν¨μ, λ©μλ, μ΄λμ λΌμ΄μ μ νλΌλ―Έν° νμ νΉμ λ¦¬ν΄ νμ
- μμ, λ³μ, νλ‘νΌν°μ νμ
- 컨ν μ΄λμΈ λ°°μ΄, μ¬μ λ±μ μμ΄ν νμ
νλ‘ν μ½ μμ
ν΄λμ€ νΉμ ꡬ쑰체 μΈμ€ν΄μ€μ νΉμ νμμ λν μ± μμ λκΈΈ μ μκ² ν΄μ£Όλ λμμΈ ν¨ν΄
μ΅μ€ν μ μ μ¬μ©
- μ΄λ―Έ μ‘΄μ¬νλ νμ μ μ νλ‘ν μ½μ λ°λ₯΄κ² νκΈ°μν΄ μ΅μ€ν μ μ μ¬μ©
- μλ κ°μ μ κ·Ό κΆνμ΄ μμ΄λ μ΅μ€ν μ μ μ¬μ©ν΄ κΈ°λ₯ νμ₯ κ°λ₯
protocol TextRepresentable {
var textualDescription: String { get }
}
쑰건μ μΌλ‘ νλ‘ν μ½ λ°λ₯΄κΈ°
where ν€μλλ₯Ό μ¬μ©ν΄ νΉμ 쑰건μ λ§μ‘±μν¬ λλ§ νλ‘ν μ½μ λ°λ₯΄λλ‘ μ ν
νλ‘ν μ½ νμ 컬λ μ
νλ‘ν μ½μ collection νμ μ λ£κΈ°μν νμ μΌλ‘ μ¬μ©κ°λ₯
let things: [TextRepresentable] = [game, d12, simonTheHamster]
for thing in things {
print(thing.textualDescription)
}
// A game of Snakes and Ladders with 25 squares
// A 12-sided dice
// A hamster named Simon
νλ‘ν μ½ μμ
ν΄λμ€ μμκ°μ΄ νλ‘ν μ½λ μμ κ°λ₯, μ½€λ§(,)λ‘ κ΅¬λΆ
protocol InheritingProtocol: SomeProtocol, AnotherProtocol {
// protocol definition goes here
}
ν΄λμ€ μ μ© νλ‘ν μ½
νλ‘ν μ½μ AnyObjectλ₯Ό μΆκ°
protocol SomeClassOnlyProtocol: AnyObject, SomeInheritedProtocol {
// class-only protocol definition goes here
}
νλ‘ν μ½ ν©μ±
λμμ μ¬λ¬ νλ‘ν μ½μ λ°λ₯΄λ νμ μ μ μΈ κ°λ₯
protocol Named {
var name: String { get }
}
protocol Aged {
var age: Int { get }
}
struct Person: Named, Aged {
var name: String
var age: Int
}
func wishHappyBirthday(to celebrator: Named & Aged) {
print("Happy birthday, \\(celebrator.name), you're \\(celebrator.age)!")
}
let birthdayPerson = Person(name: "Malcolm", age: 21)
wishHappyBirthday(to: birthdayPerson)
// Prints "Happy birthday, Malcolm, you're 21!"
νλ‘ν μ½ μμ νμΈ
μ΄λ€ νμ μ΄ νΉμ νλ‘ν μ½μ λ°λ₯΄λμ§ λ€μκ³Ό κ°μ λ°©λ²μΌλ‘ νμΈ κ°λ₯
- isμ°μ°μλ₯Ό μ΄μ©νλ©΄ μ΄λ€ νμ
μ΄ νΉμ νλ‘ν μ½μ λ°λ₯΄λμ§ νμΈκ°λ₯
- νΉμ νλ‘ν μ½μ λ°λ₯΄λ©΄ trueλ₯Ό μλλ©΄ falseλ₯Ό λ°νν©λλ€.
- as?λ νΉμ νλ‘ν μ½ νμ μ λ°λ₯΄λ κ²½μ° κ·Έ μ΅μ λ νμ μ νλ‘ν μ½ νμ μΌλ‘ λ€μ΄μΊμ€νΈλ₯Ό νκ² λκ³ λ°λ₯΄μ§ μλ κ²½μ°λ nilμ λ°ν
- as!λ κ°μ λ‘ νΉμ νλ‘ν μ½μ λ°λ₯΄λλ‘ μ μ
- λ§μ½ λ€μ΄μΊμ€νΈμ μ€ν¨νλ©΄ λ°νμ μλ¬κ° λ°μ
μ νμ νλ‘ν μ½ μꡬ쑰건
- μ νμ ꡬν 쑰건μ μ μ κ°λ₯
- @objc ν€μλλ₯Ό νλ‘ν μ½ μμ λΆμ΄κ³ κ°λ³ ν¨μ νΉμ νλ‘νΌν°μλ @objc μ optional ν€μλ μ¬μ©
- @objc νλ‘ν μ½μ ν΄λμ€ νμ μμλ§ μ¬μ©λ μ μκ³ κ΅¬μ‘°μ²΄λ μ΄κ±°νμμλ μ¬μ©ν μ μμ
@objc protocol CounterDataSource {
@objc optional func increment(forCount count: Int) -> Int
@objc optional var fixedIncrement: Int { get }
}
νλ‘ν μ½ μ΅μ€ν μ
μ΅μ€ν μ μ μ¬μ©ν΄ νλ‘ν μ½ νμ₯κ°λ₯
κΈ°λ³Έ ꡬν μ 곡
- μ΅μ€ν μ μ κΈ°λ³Έ ꡬνμ μ 곡νλλ° μ¬μ© κ°λ₯
- νλ‘ν μ½μμλ μ μΈλ§ ν μ μλλ° μ΅μ€ν μ μ μ΄μ©ν΄ κΈ°λ³Έ ꡬνμ μ 곡
extension PrettyTextRepresentable {
var prettyTextualDescription: String {
return textualDescription
}
}
νλ‘ν μ½ μ΅μ€ν μ μ μ μ½ μΆκ°
- μ΅μ€ν μ μ΄ νΉμ 쑰건μμλ§ μ μ©λλλ‘ where μ μ μ¬μ©ν΄ μ μΈ κ°λ₯
extension Collection where Element: Equatable {
func allEqual() -> Bool {
for element in self {
if element != self.first {
return false
}
}
return true
}
}
'β¨οΈ Language > swift' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Swift] μλ μ°Έμ‘° μΉ΄μ΄νΈ (0) | 2024.04.02 |
---|---|
[Swift] μ λ€λ¦ (0) | 2024.04.02 |
[Swift] μλ¬ μ²λ¦¬ (0) | 2024.03.28 |
[Swift] μ΅μ λ 체μ΄λ (0) | 2024.03.26 |
[Swift] μ΄κΈ°ν (1) | 2024.03.25 |