κ°μ΄λλ μμ±ν λ κΈ°λ₯κ³Ό λ°©λ²μ μ μ ν μ¬μ©μ λν΄ λͺ μν΄μΌ ν©λλ€. Appleμ Swift νλ‘κ·Έλλ° μΈμ΄ λ¬Έμλ₯Ό μ΄ν΄λ³΄λ©΄ λ€μκ³Ό κ°μ΅λλ€.
λ©μλλ ν΄λμ€, ꡬ쑰체 λλ μ΄κ±°νκ³Ό μ°κ²°λ ν¨μμ λλ€. μ΄λ μΈμ€ν΄μ€ λ° μ ν λ©μλ λͺ¨λμ μ μ©λ©λλ€. λ°λ©΄μ ν¨μλ μ μ λ²μμμ μ μΈλλ©° μ΄λ€ μ νμλ μνμ§ μμ΅λλ€.
μΆ©λΆν κ²μ λλ€.
"λ¬΄λ£ κΈ°λ₯"μ΄λΌκ³ νλ κΈ°λ₯λ 보μμ΅λλ€. λλ "무λ£"κ° "μ΄λ€ κ°μ²΄μλ μ°κ²°λμ§ μμ"μ μλ―Ένλ€κ³ κ°μ ν©λλ€.
ν¨μμλ Swiftμμ μ ν λ° μ μλ³΄λ€ λ λ§μ λ²μ μ΅μ μ΄ μμ΅λλ€.
Objective-C
μΌλ° λ©μλκ° μ΄μ functiona
μμ Swift
. ν¬λΌ, λΈλ‘κ·Έ, νν λ¦¬μΌ λ±μ μΈ‘λ©΄μμ λ΄κ° μ½μ λͺ¨λ μλ£λ ν΄λμ€ λλ μ΄κ±°νμ μν λμλ λ¨μν functions
λ‘ μΈκΈνμ΅λλ€.
@mitchellporter μμ μΈμ©λ¬Έμ λ°λΌ Appleμ μ체 λ¬Έμλ μ΄λ€ κ²μ ν¨μ λλ λ©μλλΌκ³ νλ κ²½μ°μ λν΄ λͺ νν©λλ€.
raywenderlich.comμ μμ΅μλ μ¬κΈ°μμ Appleμ μ§μΉ¨μ λ°λ₯΄λ―λ‘ μ€νμΌ κ°μ΄λμ ν¬ν¨λμ΄μΌ ν©λλ€.
Objective-Cμλ ν¨μμ λ©μλκ° λ λ€ μμ΅λλ€. λͺ¨λ κ²μ΄ λ°©λ²μ μλλλ€. π
@micpringle λ§μ΄ λμ§λ§, ν΄λμ€μ μν λμλ λ¨μν function
λΌκ³ λΆλ₯΄λ λ§μ μλ£λ₯Ό μ½μμ΅λλ€. λλ νμ function
λ₯Ό μ¬μ©νλ μ μΌν μ¬λμ΄ μλλΌκ³ μκ°ν©λλ€. μ΄ λ³κ²½ μ¬νμ΄ μμΌλ‘ μ΄λ»κ² λ°λλμ§ νμΈνλ κ²μ΄ ν₯λ―Έλ‘μΈ κ²μ
λλ€.
λ©μλ λ΄λΆμ "ν¨μ"κ° "μ€μ²© λ©μλ"μ
λκΉ?
ν΄λ‘μ λ΄λΆμ ν¨μ λλ κΈ°ν λΉν¨μλ₯Ό 무μμ΄λΌκ³ ν©λκΉ?
struct Struct {
let closure = {
func whoAmI() {}
}
var any: Any? {
func jeanValjean() {}
return nil
}
}
λλ μ΄κ²λ€μ΄ κΈ°μ μ μΌλ‘ μ΄λ€ κ²μλ "μνμ§" μκΈ° λλ¬Έμ μ΅λͺ ν¨μ(IMO)λ‘ λΆλ₯λ κ²μ΄λΌκ³ μκ°ν©λλ€. κ·Έκ²λ€μ νΉμ λ²μ λ΄μμλ§ μ‘΄μ¬νλ©° κ·Έ μΈλΆμμ μ‘μΈμ€ν μ μμ΅λλ€.
λλ μ¬κΈ°μ "μ΅λͺ ν¨μ"κ° μ¬λ°λ₯Έ μ΄λ¦μ΄λΌκ³ μκ°νμ§ μμ΅λλ€. μΌλ°μ μΌλ‘ ν΄λ‘μ λ₯Ό λνλ λλ€.
μ΄λ¦μ΄ μ§μ λ μ νμ΄λ μΈμ€ν΄μ€μ μ°κ²°λ λ©μλκ° μλλΌ ν¨μμ΄κΈ° λλ¬Έμ "μ€μ²© ν¨μ": "ν¨μ"λΌκ³ λΆλ¦ λλ€. κ·Έλ¦¬κ³ "μ€μ²©"λ μ΄μ λ... μ€μ²©λμ΄ μκΈ° λλ¬Έμ λλ€! "λ²μ κΈ°λ₯"μΌ μλ μμ§λ§ λͺ ννμ§ μμ κ² κ°μ΅λλ€.
μ£μ‘ν©λλ€. ν΄λ‘μ κ° μ΅λͺ ν¨μλΌκ³ λ λΆλ¦¬λμ§ λͺ°λμ΅λλ€. :]
μ€μ²©λ κΈ°λ₯μ λμκ² μ’κ² λ€λ¦½λλ€. λ²μκ° μ λλ‘ λ€λ¦¬μ§ μλλ€λ λ° λμν©λλ€.
λ°©λ²μ΄λ μλλ λͺ¨λ λ΄λΆμ "μ€μ²© ν¨μ"λ κ°κΉμ΄ λ―Έλμ μΆ©λΆν λͺ νν΄ λ³΄μ λλ€.
κ·Έλ¦¬κ³ μ΄λ¦μ΄ μλ μ€μ²© ν¨μκ° "μ΅λͺ
"μ΄ λλ€κ³ μκ°νμ§λ§ μ νν "μ΅λͺ
"μ΄ λ¬΄μμΈμ§ λͺ
ννμ§ μμ΅λλ€. κ·Έλ¬λ ν΄λ‘μ , νΉν μ μ₯λκ³ λ³κ²½ λΆκ°λ₯ν ν¨μμ λ§€μ° μ μ¬ν ν΄λ‘μ μ κ΄ν΄μλ λͺ
ννμ§ μμ΅λλ€. λλ μ μ₯λ ν¨μκ° μ€μ λ‘ μ΅λͺ
μ΄λΌκ³ λ―Ώλ μͺ½μΌλ‘ κΈ°μΈκ³ μμ§λ§ κ·Έκ²μ ν¬μ°©νλ ν΄λ‘μ μ μ μ¬μ μΌλ‘ μ΄λ€ μνμ μ΄λ¦μ΄ μλ κ²μ
λλ€. μ΄κ²μ΄ C#μ λν΄ κ°λ₯΄μΉλ λ°©μμ
λλ€. μ¬κΈ°μ λλ€ κ΅¬λ¬Έμ λ리μλΌκ³ νλ κ²μ ꡬμ±νκΈ° μν μΆμ½νμ
λλ€.
https://msdn.microsoft.com/en-us/library/system.delegate (v=vs.110).aspx
func nonymous() {
func nonymous() {}
}
let anonymouses: [() -> ()] = [].map
{$0} // This "transform" is also anonymous.
let unlcearToMeWhetherNonymous = {}
μ΄κ²μ λ―Έλ¬ν μμ μ΄λ©°, Swiftμ λ΄λΆλ‘ λ΄λ €κ°λ©΄ λͺ¨λ κ²μ΄ λμΌνμ§λ§ func
무μΈκ°λ₯Ό μ μΈνλ©΄ νμ€ν μ΄λ¦μ μ μ μμ΅λλ€. λμ‘°μ μΌλ‘ ν΄λ‘μ λ μ΄λ¦μ΄ μλ μ½λ λΈλ‘μΌ λΏμ
λλ€. λ¬Όλ‘ λ³μλ μμμ ν λΉν μ μμ§λ§ μ΄λ ν¬μΈν°λ₯Ό μ μ₯νλ κ²μΌ λΏμ
λλ€.
λ€μ λ§νμ§λ§ μΌμ’
μ μΈμμ μΈ μ°¨μ΄μ
λλ€. λΉμ μ λͺ¨λ lispμ λΉμ·ν μ μκ³ func
λ ν΄λ‘μ μ μ΄λ¦μ λΆμ¬νκΈ° μν ꡬ문 μ€νμ΄λΌκ³ λ§ν μ μμ΅λλ€.
λ€μκ³Ό κ°μ κ²μ μ΄λ»μ΅λκΉ?
λ©μλ λ μμ ν¨μ
λ©μλλ μ νκ³Ό μ°κ΄λ κΈ°λ₯μ΄λ©° μλ μμ± κ²μ κ°λ₯μ±μΌλ‘ μΈν΄ μ νΈλ©λλ€. μμ ν¨μλ λ μΌλ°μ μ΄μ§λ§ μμ μ΄ νΉμ μ ν λλ μΈμ€ν΄μ€μ λ°μ νκ² μ°κ΄λμ§ μμ λ μλ―Έκ° μμ΅λλ€.
μ°μ μ
let sorted = items.mergeSort() // easily discoverable
rocket.launch() // a mutating method
μ νΈνμ§ μμ
let sorted = mergeSort(items)
launch(&rocket)
λ¬΄λ£ ν¨μ μμΈ
let tuples = zip(a, b) // feels natural as a free function (symmetry)
let value = max(x,y,z) // another free function that feels natural
μ κ΄νμ¬,
λ¬΄λ£ ν¨μ μμΈ
let tuples = zip(a, b) // feels natural as a free function (symmetry) let value = max(x,y,z) // another free function that feels natural
"μμ°μ€λ½λ€"λ κ²μ μλΉν λͺ¨νΈνκ³ μ£Όκ΄μ μ λλ€.
μ¬κΈ°μ μ°λ¦¬κ° μλ―Ένλ λ°λ₯Ό λͺ νν ν μ μμ΅λκΉ?
λν zip
λ° max
λͺ¨λ κ·νκ° PRμμ μ κΈ°ν // hard to discover
λ¬Έμ λ‘ μΈν΄ μ΄λ €μμ κ²ͺμ κ²μ
λλ€.
IMHO, zip
κ° μ΄μν μλΌκ³ μκ°ν©λλ€. λ΄κ° κ°μ§ λ¬Έμ :
a
λ° b
? a
λ° b
μ΄λ»κ²λ μμΆνμκ² μ΅λκΉ? λ€λ₯Έ κ²? λ λ§μ λ§₯λ½μ΄ μμΌλ©΄ μκΈ°κ° μ΄λ ΅μ΅λλ€.λμ μ
μμ ν¨μλ λ μΌλ°μ μ΄μ§λ§ μμ μ΄ νΉμ μ ν λλ μΈμ€ν΄μ€μ λ°μ νκ² μ°κ΄λμ§ μμ λ μλ―Έκ° μμ΅λλ€.
μ΄κ±΄ μ΄λμ?
ν΄λμ€λ μ νμ μ°κ²°λμ§ μμ μμ ν¨μλ μκ»΄μ μ¬μ©ν΄μΌ ν©λλ€. κ°λ₯νλ©΄ μμ ν¨μ λμ λ©μλλ₯Ό μ¬μ©νλ κ²μ μ νΈν©λλ€. μ΄κ²μ κ°λ μ±κ³Ό κ²μ κ°λ₯μ±μ λμ΅λλ€.
μμ ν¨μλ νΉμ μ νμ΄λ μΈμ€ν΄μ€μ μ°κ΄λμ§ μμ λ κ°μ₯ μ ν©ν©λλ€.
Free Function Exceptions
μ λν μΆκ° ν λ‘ μ μ°ΎκΈ° μν΄ μ΄ λ¬Έμ λ₯Ό λ€μ μ½λλ€.
μ΄κ²μ νμ€ λΌμ΄λΈλ¬λ¦¬ κΈ°λ₯μ λλ€. R, Python, C#, C++μ κ°μ μΈμ΄μμ μ°μ μμκ° μμ΅λλ€.(λΆμ€νΈλ₯Ό ν΅ν΄).
μ΄κ²μ νμ€ λΌμ΄λΈλ¬λ¦¬ κΈ°λ₯μ λλ€.
μ§μ§? iOSμμλ μμ¨λ΄μ... *λΉν©*
νμΈνκ² μ΅λλ€... iOSμμ λ리 μ΄ν΄/μ¬μ©λλ κ²½μ° μ¬κΈ°μμ μ°λ €νλ μ¬νμ΄ μλͺ»λ κ²μΌ μ μμ΅λλ€.
λλ λΉμ μ μ₯ν©ν μ μμ μ’μν©λλ€ ... λλ zip μμ λ₯Ό ν¬κΈ°νκΈ°λ₯Ό 꺼립λλ€. (μΆμ : RW Swift νμ iOSλ³΄λ€ ν¬κ±°λ μμ νμ₯μ κ°μ§κ³ μμ΅λλ€.)
RW Swift Teamμ iOSλ³΄λ€ ν¬κ±°λ μμ νμ₯μ κ°μ§κ³ μμ΅λλ€.
π μ¬μ€μ΄λ€. ;]
zipμ΄ νλ μΌμ κ²ν ν ν μμ λ‘ λ¨κ²¨λκ² μ΅λλ€. π
λ΄ Swift-newbie-moment κ²½νμ λν΄ μ¬κ³Όλ립λλ€. π
κ±±μ λ§. νμ λμμ£Όμ μ κ°μ¬ν©λλ€. BTW, λ°©κΈ ν¬λ λ§μ μΈκΈλμ§ μμ κ²μΌλ‘ λνλ¬μ΅λλ€. λλ κ³ μΉ κ².
λ¬΄λ£ κΈ°λ₯μ΄ μ΅κ³ μ μ루μ μΈμ§ νμ ν μ μμ΅λλ€. μ¬μ©νλ€λ©΄ λ€λ₯Έ κ³³μμ λ€λ£¨μ§ μλ κΈ°λ₯μ μΆκ°ν΄μΌ νλ€κ³ μκ°ν©λλ€.
μ΅λ
let max = Swift.max(0, 1, 2)
let maxElement = [0, 1, 2].maxElement()!
maxElement
λ λ©μλκ° μλλΌ μμ±μ΄μ΄μΌ νμ§λ§ μ¬μ ν μμ κΈ°λ₯μ΄ μ€λ³΅λλ€κ³ μκ°ν©λλ€. μ΄κ²μ΄ λμΌν κ²μΌλ‘ μ»΄νμΌλμ§ μμΌλ©΄ μ»΄νμΌλ¬κ° κ°μ λμ΄μΌ νλ€κ³ μκ°νμ§λ§ κ·Έλ μ§ μλλΌλ μ±λ₯μ΄ μ€μνμ§ μμ κ²μ΄λΌκ³ μκ°ν©λλ€. λλ μ¬λλ€μ΄ λ§μ μμμ ν¨κ» max κΈ°λ₯μ μ¬μ©ν κ²μ΄λΌκ³ μκ°νμ§ μμ΅λλ€.
μ§νΌ
C#μμ zipμ Swift νλ‘ν μ½ νμ₯ λ©μλμ λμΌνκ² κ΅¬ν λ©λλ€. λ μ’μ§λ μμ§λ§ zip
λ€λ₯΄κ² μ²λ¦¬νλ λ°©λ²μ μμ
λλ€.
Swiftμμ zip
λ Zip2Sequence
λν μ΄ μ΄λμ
λΌμ΄μ μ λμΌν©λλ€. λ€μν μ
λ ₯ μνμ€μ μμΆ μνμ€λ₯Ό λνλ΄λ λ°©λ²μ΄ μμΌλ©΄ μ’κ² μ§λ§ κ·Έλ κ² λκΈ° μ κΉμ§λ μ΄κΈ°ν νλ‘κ·Έλ¨μ μ§μ μ¬μ©νλ κ²μ΄ μ’λ€κ³ μκ°ν©λλ€.
zip([1...3], ["a"..."c"])
Zip2Sequence([1...3], ["a"..."c"])
μ°μ°μ
λ΄κ° Swiftλ‘ μμ±ν λλΆλΆμ λ¬΄λ£ ν¨μλ μ°μ°μμ
λλ€. λλ Chris Lattnerμ Joe Groffκ° λ―Έλμ C#κ³Ό κ°μ μ ν λ΄μμ μ°μ°μλ₯Ό μ μν μ μμ κ²μ΄λΌκ³ μ μνλ κ²μ 보μμ΅λλ€. λ°λΌμ μ°μ°μλ λ€λ₯Έ ν¨μμ λν΄ μ νλ κ·μΉμ λ°λ₯Ό μλ μμ΅λλ€. νμ¬μ μμ κΈ°λ₯ μ μ© κ΅¬νμ μλ§λ μ§μΉ¨μΌλ‘ μ¬μ©λμ΄μλ μ λ©λλ€.
μ°μ°μ
λ΄κ° Swiftλ‘ μμ±ν λλΆλΆμ λ¬΄λ£ ν¨μλ μ°μ°μμ λλ€. λλ Chris Lattnerμ Joe Groffκ° λ―Έλμ C#κ³Ό κ°μ μ ν λ΄μμ μ°μ°μλ₯Ό μ μν μ μμ κ²μ΄λΌκ³ μ μνλ κ²μ 보μμ΅λλ€...
λ€, μ΄κ²μ΄ Swiftκ° μμΌλ‘ λμκ° λ°©ν₯μΌ κ²μ λλ€. κ·νκ° μΈκΈν κ²μ²λΌ Chris Lattnerμ μ΅κ·Ό μ μμ΄ μμ΅λλ€.
μ΄κ²μ νΉν Equatable
μ κ°μ νλ‘ν μ½μμ λ
νΉν©λλ€. μ΄ νλ‘ν μ½μ νμ₯ μ§μΉ¨μ λ°λΌ λ³Έμ§μ μΌλ‘ λΉ νμ₯μ μμ±ν΄μΌ _νμν©λλ€_. μ΄κ²μ κΈ°κ»ν΄μΌ μ΄μν©λλ€. π
λλ νμ€ν μ΄μμκ° μ΄μμ λ¬΄λ£ κΈ°λ₯μ λν μμ λ‘ μ¬μ©λμ΄μλ μλλ€λ κ²μ λμν©λλ€.
@Jessy- μ λκΈ κ°μ¬ν©λλ€!
λͺ κ°μ§ μ°Έκ³ μ¬ν:
maxElement()
λ O(1)μ΄ μλκΈ° λλ¬Έμ μΌλΆ μ¬μ©μμκ² λλ μ μλ λ©μλλ‘ μ μΈλμλ€κ³ μκ°ν©λλ€. O(1)μ΄ μλ μμ±μ ꡬννλ κ²½μ° λͺ
ννκ² λ¬Έμνν΄μΌ ν©λλ€. (RW νν 리μΌμμ μ°λ¦¬λ λͺ¨λ μ½λκ° κ³΅κ°λμ΄ μλ€λ μ¬μΉλ₯Ό κ°μ§κ³ μμΌλ―λ‘ κ·Έκ²μ λν΄ λ§μ΄ κ±±μ νκ±°λ μ€νμΌ μ§μΉ¨μΌλ‘ μνν νμκ° μμ΅λλ€.)
λ°λ©΄μ max<T: Comparable>
μ μΌλΆ νμμ O(1)μ΄λ©° νλμ¨μ΄λ₯Ό νμ©νκΈ° μν΄ νΉνλ κ°λ₯μ±μ΄ μμ΅λλ€. (νμΈνμ§λ μμμ§λ§ κ°λ³ν λ²μ μΈμ λ κ°μ 맀κ°λ³μ λ²μ μ΄ μλ κ²λ κ·Έ λλ¬ΈμΈ κ² κ°μ΅λλ€.)
μ΄λ€ κ²½μ°λ , λλ μ°λ¦¬ λͺ¨λκ° μμ κΈ°λ₯μ΄ λλ¬Όκ² μ¬μ©λμ΄μΌ νλ€λ λ° λμνλ€κ³ μκ°νμ§λ§ μ λ _μ λ_ λ°λν κ²μ
λλ€. μ¬μ©λ μμ λ νμ€ λΌμ΄λΈλ¬λ¦¬μμ κ°μ Έμ¨ κ²μ
λλ€. νμ€ λΌμ΄λΈλ¬λ¦¬μμ zip
κΈ°λ₯μ μ κ±°νμλ μ μμ λ³Έ μ μ΄ μμ΅λλ€. @JRG-Developerμ λ¨μ΄ λ³κ²½ λλ νμ¬ λ³ν©λ pull μμ² λͺ¨λμ μ΄ λ¨μ΄ λ³κ²½μ λν μ΄μκ° μμ΅λκΉ?
λ λ Όμν΄μΌ ν μ¬νμ΄ μλ€κ³ μκ°λλ©΄ μΈμ λ μ§ λ€μ μ΄μ΄ μ£Όμμμ€. (μ λ°μ΄νΈ λΈλμΉμ λ³ν©λμμ΅λλ€.)
κ°μ₯ μ μ©ν λκΈ
λ€μκ³Ό κ°μ κ²μ μ΄λ»μ΅λκΉ?
λ©μλ λ μμ ν¨μ
λ©μλλ μ νκ³Ό μ°κ΄λ κΈ°λ₯μ΄λ©° μλ μμ± κ²μ κ°λ₯μ±μΌλ‘ μΈν΄ μ νΈλ©λλ€. μμ ν¨μλ λ μΌλ°μ μ΄μ§λ§ μμ μ΄ νΉμ μ ν λλ μΈμ€ν΄μ€μ λ°μ νκ² μ°κ΄λμ§ μμ λ μλ―Έκ° μμ΅λλ€.
μ°μ μ
μ νΈνμ§ μμ
λ¬΄λ£ ν¨μ μμΈ