рд╣реБрдб рдХреЗ рддрд╣рдд рд╕реНрд╡рд┐рдлреНрдЯ: рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди

рдЬреЗрдиреЗрд░рд┐рдХ рдХреЛрдб рдЖрдкрдХреЛ рд▓рдЪреАрд▓рд╛, рдкреБрди: рдкреНрд░рдпреЛрдЬреНрдп рдХрд╛рд░реНрдпреЛрдВ рдФрд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдмрдирд╛рддрд╛ рд╣реИ рдЬреЛ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рдЕрдзреАрди рд╣реИрдВред рдЖрдк рдРрд╕рд╛ рдХреЛрдб рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рджреЛрд╣рд░рд╛рд╡ рд╕реЗ рдмрдЪрддрд╛ рд╣реИ рдФрд░ рдЕрдкрдиреЗ рдЗрд░рд╛рджреЗ рдХреЛ рд╕реНрдкрд╖реНрдЯ, рдЕрдореВрд░реНрдд рддрд░реАрдХреЗ рд╕реЗ рд╡реНрдпрдХреНрдд рдХрд░рддрд╛ рд╣реИред - рд╕реНрд╡рд┐рдлреНрдЯ рдбреЙрдХреНрд╕

рд╕реНрд╡рд┐рдлреНрдЯ рдкрд░ рд▓рд┐рдЦрдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдиреЗ рдЬреЗрдиреЗрд░рд┐рдХ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ред Array , Dictionary , Set - рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реЗ рдЬреЗрдирд░рд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдмреБрдирд┐рдпрд╛рджреА рд╡рд┐рдХрд▓реНрдкред рдХреИрд╕реЗ рд╡реЗ рдЕрдВрджрд░ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░ рд░рд╣реЗ рд╣реИрдВ? рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдРрдкреНрдкрд▓ рдЗрдВрдЬреАрдирд┐рдпрд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рднрд╛рд╖рд╛ рдХреА рдЗрд╕ рдореМрд▓рд┐рдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред


рдЬреЗрдиреЗрд░рд┐рдХ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдпрд╛ рддреЛ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рджреНрд╡рд╛рд░рд╛ рд╕реАрдорд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рд╕реАрдорд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореВрд▓ рд░реВрдк рд╕реЗ, рдЬреЗрдиреЗрд░рд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЬрди рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡рд┐рдзрд┐ рдорд╛рдкрджрдВрдбреЛрдВ рдпрд╛ рдкреНрд░рдХрд╛рд░ рдХреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


рдЬреЗрдирд░рд┐рдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕реНрд╡рд┐рдлреНрдЯ рджреЛ рддрд░реАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИ:


  1. рд░рдирдЯрд╛рдЗрдо-рд╡реЗ - рдЬреЗрдиреЗрд░рд┐рдХ рдХреЛрдб рдПрдХ рдЖрд╡рд░рдг (рдмреЙрдХреНрд╕рд┐рдВрдЧ) рд╣реИред
  2. рдХрдВрдкрд╛рдЗрд▓рдЯрд╛рдЗрдо-рд╡реЗ - рдЬреЗрдиреЗрд░рд┐рдХ рдХреЛрдб рдХреЛ рдЕрдиреБрдХреВрд▓рди (рд╕реНрдкреЗрд╢рд▓рд╛рдЗрдЬреЗрд╢рди) рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░ рдХреЗ рдХреЛрдб рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдореБрдХреНрдХреЗрдмрд╛рдЬрд╝реА


рдПрдХ рдЕрд╕реАрдорд┐рдд рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдЬреЗрдиреЗрд░рд┐рдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд░рд▓ рд╡рд┐рдзрд┐ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:


 func test<T>(value: T) -> T { let copy = value print(copy) return copy } 

рд╕реНрд╡рд┐рдлреНрдЯ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛрдб рдХрд╛ рдПрдХ рдПрдХрд▓ рдмреНрд▓реЙрдХ рдмрдирд╛рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдХрд┐рд╕реА рднреА <T> рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣реА рд╣реИ, рднрд▓реЗ рд╣реА рд╣рдо test(value: 1) рдпрд╛ test(value: "Hello") рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рдЙрд╕реА рдХреЛрдб рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ <T> рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдЬрд╛рдирдХрд╛рд░реА рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╡рд┐рдзрд┐ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред ред


рдРрд╕реЗ рдЕрд╕реАрдорд┐рдд рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдереЛрдбрд╝рд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдпрд╣ рдЬрд╛рдирдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдкреИрд░рд╛рдореАрдЯрд░ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдХреИрд╕реЗ рдмрдирд╛рдИ рдЬрд╛рдП, рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдЬрд╛рдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЖрдкрдХреЛ рдпрд╣ рдЬрд╛рдирдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдЫреЛрдбрд╝рддреЗ рд╕рдордп рдЗрд╕реЗ рдХреИрд╕реЗ рдирд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдП рджреГрд╢реНрдпрддрд╛ред рдЗрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Value Witness Table ( VWT ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред VWT рд╕рднреА рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдВрдХрд▓рди рдЪрд░рдг рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдХрдВрдкрд╛рдЗрд▓рд░ рдЧрд╛рд░рдВрдЯреА рджреЗрддрд╛ рд╣реИ рдХрд┐ рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХрд╛ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рд▓реЗрдЖрдЙрдЯ рд╣реЛрдЧрд╛ред рдореИрдВ рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛ рджреВрдВ рдХрд┐ рд╕реНрд╡рд┐рдлреНрдЯ рдореЗрдВ рд╕рдВрд░рдЪрдирд╛рдПрдВ рдореВрд▓реНрдп рдФрд░ рд╕рдВрджрд░реНрднреЛрдВ рджреНрд╡рд╛рд░рд╛ рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рдкрд╛рд░рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП T == MyStruct рдФрд░ T == MyStruct рд╕рд╛рде let copy = value рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЪреАрдЬреЗрдВ рдХреА T == MyStruct ред


рдорд╛рди рдЧрд╡рд╛рд╣ рддрд╛рд▓рд┐рдХрд╛

рдпрд╣реА рд╣реИ, рд╡рд╣рд╛рдБ рдШреЛрд╖рд┐рдд рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде test рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рдЕрдВрддрддрдГ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛:


 //  ,  metadata   let myStruct = MyStruct() test(value: myStruct, metadata: MyStruct.metadata) 

рдЪреАрдЬреЗрдВ рддрдм рдереЛрдбрд╝реА рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реЛ MyStruct рдЬрдм MyStruct рдЖрдк рдореЗрдВ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрд░рдЪрдирд╛ рд╣реИ рдФрд░ MyStruct<T> рдХрд╛ рд░реВрдк рд▓реЗ рд▓реЗрддрд╛ рд╣реИред MyStruct рдЕрдВрджрд░ <T> рдЖрдзрд╛рд░ рдкрд░, рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдФрд░ VWT MyStruct<Int> рдФрд░ MyStruct<Bool> рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реЛрдВрдЧреЗред рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рдпреЗ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░ рд╣реИрдВред рд▓реЗрдХрд┐рди MyStruct рдФрд░ T рдХреЗ рд╣рд░ рд╕рдВрднрд╡ рд╕рдВрдпреЛрдЬрди рдХреЗ рд▓рд┐рдП рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдмрдирд╛рдирд╛ рдмреЗрд╣рдж рдЕрдХреНрд╖рдо рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕реНрд╡рд┐рдлреНрдЯ рджреВрд╕рд░реЗ рддрд░реАрдХреЗ рд╕реЗ рдЬрд╛рддреА рд╣реИ, рдФрд░ рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЪрд▓рддреЗ-рдлрд┐рд░рддреЗ рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рд╣реЛрддрд╛ рд╣реИред рдХрдВрдкрд╛рдЗрд▓рд░ рдЬреЗрдиреЗрд░рд┐рдХ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдкреИрдЯрд░реНрди рдмрдирд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╕рд╣реА VWT рд╕рд╛рде рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рдкреВрд░реНрдг рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд VWT ред


 //   ,  metadata   func test<T>(value: MyStruct<T>, tMetadata: T.Type) { //       let myStructMetadata = get_generic_metadata(MyStruct.metadataPattern, tMetadata) ... } let myStruct = MyStruct<Int>() test(value: myStruct) //   test(value: myStruct, tMetadata: Int.metadata) //      

рдЬрдм рд╣рдо рд╕реВрдЪрдирд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдорд┐рд▓рддрд╛ рд╣реИ рдХрд┐ рд╣рдо (рдкреНрд░рддрд┐рд▓рд┐рдкрд┐, рдЪрд╛рд▓, рдирд╖реНрдЯ) рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


рдпрд╣ рдЕрднреА рднреА рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИ рдЬрдм рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдХреЛ рдЬреЗрдирд░рд┐рдХ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо <T> Equatable рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рддрдХ Equatable рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рддрд░реАрдХрд╛ рд╣реИ рдЬреЛ рджреЛ рддрд░реНрдХреЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░рддрд╛ рд╣реИред рдкрд░рд┐рдгрд╛рдо рддреБрд▓рдирд╛ рд╡рд┐рдзрд┐ рдкрд░ рд╕рд┐рд░реНрдл рдПрдХ рдЖрд╡рд░рдг рд╣реИред


 func isEquals<T: Equatable>(first: T, second: T) -> Bool { return first == second } 

рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЗ рдкрд╛рд╕ рддреБрд▓рдирд╛ рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реВрдЪрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП static func ==(lhs:T, rhs:T) ред рдЗрд╕реЗ рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ? рдЬрд╛рд╣рд┐рд░ рд╣реИ, VWT рдЯреНрд░рд╛рдВрд╕рдорд┐рд╢рди рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИ, рдЗрд╕рдореЗрдВ рдпрд╣ рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рд╣реИред рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ Protocol Witness Table рдпрд╛ PWT ред рдпрд╣ VWT рд╕рдорд╛рди рд╣реИ рдФрд░ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рд╕рдВрдХрд▓рди рдХреЗрдВрджреНрд░ рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЗрди рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред


 isEquals(first: 1, second: 2) //   //     isEquals(first: 1, // 1 second: 2, metadata: Int.metadata, // 2 intIsEquatable: Equatable.witnessTable) // 3 

  1. рджреЛ рддрд░реНрдХ рджрд┐рдП
  2. Int рд▓рд┐рдП рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдкрд╛рд╕ рдХрд░реЗрдВ рддрд╛рдХрд┐ рдЖрдк рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдХреЙрдкреА / рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд / рдирд╖реНрдЯ рдХрд░ рд╕рдХреЗрдВ
  3. рд╣рдо рдЬрд╛рдирдХрд╛рд░реА рджреЗрддреЗ рд╣реИрдВ рдХрд┐ Int Equatable ред

рдпрджрд┐ рдкреНрд░рддрд┐рдмрдВрдз рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рдЕрдиреНрдп рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, T: Equatable & MyProtocol , рддреЛ MyProtocol рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдирд┐рдореНрди рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝реА рдЬрд╛рдПрдЧреА:


 isEquals(..., intIsEquatable: Equatable.witnessTable, intIsMyProtocol: MyProtocol.witnessTable) 

рдЬреЗрдирд░рд┐рдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░реИрдкрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдЖрдк рд▓рдЪреАрд▓реЗ рдврдВрдЧ рд╕реЗ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдПрдХ рдУрд╡рд░рд╣реЗрдб рд╣реИ рдЬрд┐рд╕реЗ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛


рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рджреМрд░рд╛рди рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдирд╛рд╡рд╢реНрдпрдХ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рддрдерд╛рдХрдерд┐рдд рдЬреЗрдиреЗрд░рд┐рдХ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдпрд╣ рдЖрдкрдХреЛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЖрд╡рд░рдг рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, isEquals(first: 1, second: 2) рд▓рд┐рдП рджреЛ рдХреЙрд▓ рдХреЗ рд▓рд┐рдП isEquals(first: 1, second: 2) рдФрд░ isEquals(first: "Hello", second: "world") , рдореБрдЦреНрдп "рдЖрд╡рд░рдг" рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдЕрд▓рд╛рд╡рд╛, Int рдФрд░ рдХреЗ рд▓рд┐рдП рд╡рд┐рдзрд┐ рдХреЗ рджреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рд╕рдВрд╕реНрдХрд░рдгред String ред


рд╕реНрд░реЛрдд рдХреЛрдб


рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдПрдХ рдЬреЗрдиреЗрд░рд┐рдХ.рд╡рд┐рдлрд╝реНрдЯ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдВ рдФрд░ рдПрдХ рдЫреЛрдЯрд╛ рдЬреЗрдиреЗрд░рд┐рдХ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦреЗрдВ, рдЬрд┐рд╕ рдкрд░ рд╣рдо рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗред


 func isEquals<T: Equatable>(first: T, second: T) -> Bool { return first == second } isEquals(first: 10, second: 11) 

рдЕрдм рдЖрдкрдХреЛ рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдХрд┐ рдпрд╣ рдЖрдЦрд┐рд░рдХрд╛рд░ рдПрдХ рд╕рдВрдХрд▓рдХ рдореЗрдВ рдХреНрдпрд╛ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИред
рдпрд╣ рд╕реНрд╡рд┐рдлреНрдЯ рдЗрдВрдЯрд░рдореАрдбрд┐рдПрдЯ рднрд╛рд╖рд╛ рдпрд╛ SIL рдореЗрдВ рд╣рдорд╛рд░реА .swift рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдХреЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


рдПрд╕рдЖрдИрдПрд▓ рдФрд░ рд╕рдВрдХрд▓рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рд╕рд╛


SIL рддреЗрдЬреА рд╕реЗ рд╕рдВрдХрд▓рди рдХреЗ рдХрдИ рдЪрд░рдгреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред


рд╕рдВрдХрд▓рдХ рдкрд╛рдЗрдкрд▓рд╛рдЗрди

рд╕реНрд░реЛрдд рдХреЛрдб .swift рдХреЛ Lexer рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рднрд╛рд╖рд╛ рдХрд╛ рдПрдХ рд╕рд╛рд░ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдЯреНрд░реА ( AST ) рдмрдирд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХреЛрдб рдХреА рдЬрд╛рдБрдЪ рдФрд░ рдЕрд░реНрде рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕рд┐рд▓реНрдЧреЗрди AST рдХреЛ SIL рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ raw SIL рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХреЛрдб рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдПрдХ рдЕрдиреБрдХреВрд▓рд┐рдд canonical SIL рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ IR рдХреЛ рд░реВрдкрд╛рдВрддрд░рдг рдХреЗ рд▓рд┐рдП IRGen рдХреЛ рдкрд╛рд╕ рдХрд┐рдпрд╛ IRGen - рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рд╛рд░реВрдк рдЬрд┐рд╕реЗ LLVM рд╕рдордЭрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ , . ``ред , . , . SIL` , . ред


рдФрд░ рдлрд┐рд░ рд╕реЗ рдЬреЗрдирд░рд┐рдХ рддрдХ


рд╣рдорд╛рд░реЗ рд╕реЛрд░реНрд╕ рдХреЛрдб рд╕реЗ рдПрдХ SIL рдлрд╛рдЗрд▓ рдмрдирд╛рдПрдВред


 swiftc generic.swift -O -emit-sil -o generic-sil.s 

рд╣рдореЗрдВ рдПрдХреНрд╕рдЯреЗрдВрд╢рди *.s рд╕рд╛рде рдПрдХ рдирдИ рдлрд╝рд╛рдЗрд▓ рдорд┐рд▓рддреА рд╣реИред рдЕрдВрджрд░ рджреЗрдЦрдиреЗ рдкрд░, рд╣рдо рдореВрд▓ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдХрдо рдкрдардиреАрдп рдХреЛрдб рджреЗрдЦреЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╕реНрдкрд╖реНрдЯ рд╣реИред


рдХрдЪреНрдЪрд╛ рдореМрди

рдЯрд┐рдкреНрдкрдгреА рдХреЗ рд╕рд╛рде рд▓рд╛рдЗрди рдЦреЛрдЬреЗрдВ // isEquals<A>(first:second:) ред рдпрд╣ рд╣рдорд╛рд░реА рд╡рд┐рдзрд┐ рдХреЗ рд╡рд░реНрдгрди рдХреА рд╢реБрд░реБрдЖрдд рд╣реИред рдпрд╣ рдПрдХ рдЯрд┐рдкреНрдкрдгреА // end sil function '$s4main8isEquals5first6secondSbx_xtSQRzlF' рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред рдЖрдкрдХрд╛ рдирд╛рдо рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЖрдЗрдП рд╡рд┐рдзрд┐ рд╡рд░реНрдгрди рдХрд╛ рдереЛрдбрд╝рд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВред


  • рд▓рд╛рдЗрди 21 рдкрд░ %0 рдФрд░ %1 рдХреНрд░рдорд╢рдГ first рдФрд░ second рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВ
  • 24 рд▓рд╛рдЗрди рдкрд░ рд╣рдо рдЯрд╛рдЗрдк рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ %4 рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ
  • рд▓рд╛рдЗрди 25 рдкрд░ рд╣рдореЗрдВ рдЯрд╛рдЗрдк рдЬрд╛рдирдХрд╛рд░реА рд╕реЗ рддреБрд▓рдирд╛ рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХреЗрддрдХ рдорд┐рд▓рддрд╛ рд╣реИ
  • 26 рд▓рд╛рдЗрди рдкрд░ рд╣рдо рдкреЙрдЗрдВрдЯрд░ рдХреЛ рд╡рд┐рдзрд┐ рдХрд╣рддреЗ рд╣реИрдВ, рдпрд╣ рджреЛрдиреЛрдВ рдорд╛рдкрджрдВрдбреЛрдВ рдФрд░ рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ
  • 27 рд▓рд╛рдЗрди рдкрд░ рд╣рдо рдкрд░рд┐рдгрд╛рдо рджреЗрддреЗ рд╣реИрдВред

рдирддреАрдЬрддрди, рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ: рдЬреЗрдиреЗрд░рд┐рдХ рдкрджреНрдзрддрд┐ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рджреМрд░рд╛рди <T> рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡рд┐рд╡рд░рдг рд╕реЗ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред


рд╣рдо рд╕реАрдзреЗ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВред


рд╕рдВрдХрд▓рд┐рдд SIL рдлрд╝рд╛рдЗрд▓ рдореЗрдВ, рд╕рд╛рдорд╛рдиреНрдп isEquals рд╡рд┐рдзрд┐ рдХреА рдШреЛрд╖рдгрд╛ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж, Int рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рдХреА рдШреЛрд╖рдгрд╛ред



рд╡рд┐рд╢рд┐рд╖реНрдЯ рдПрд╕рдЖрдИрдПрд▓

рд▓рд╛рдЗрди 39 рдкрд░, рдЯрд╛рдЗрдк рдЬрд╛рдирдХрд╛рд░реА рд╕реЗ рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рд╡рд┐рдзрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдкреВрд░реНрдгрд╛рдВрдХ "cmp_eq_Int64" рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рддреБрд░рдВрдд рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред


"рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ" рдХреА рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП, рдЕрдиреБрдХреВрд▓рди рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП ред рдЖрдкрдХреЛ рдпрд╣ рднреА рдЬрд╛рдирдирд╛ рд╣реЛрдЧрд╛


рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝рд░ рдХреЗрд╡рд▓ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рд╕рд╛рдорд╛рдиреНрдп рдШреЛрд╖рдгрд╛ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рд╡рд░реНрддрдорд╛рди рдореЙрдбреНрдпреВрд▓ ( рд╕реНрд░реЛрдд ) рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИ

рдЕрд░реНрдерд╛рддреН, рд╡рд┐рднрд┐рдиреНрди рд╕реНрд╡рд┐рдлреНрдЯ рдореЙрдбреНрдпреВрд▓ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреЛрдХреЛрдкреЛрдбреНрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рдзрд┐) рдХреЗ рдмреАрдЪ рд╡рд┐рдзрд┐ рдХреЛ рд╡рд┐рд╢реЗрд╖ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдПрдХ рдЕрдкрд╡рд╛рдж рдорд╛рдирдХ рд╕реНрд╡рд┐рдлреНрдЯ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИ, рдЬрд┐рд╕рдореЗрдВ Array , Set рдФрд░ Dictionary рдЬреИрд╕реЗ рдмреБрдирд┐рдпрд╛рджреА рдкреНрд░рдХрд╛рд░ рд╣реИрдВред рдмреЗрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд╕рднреА рдЬреЗрдирд░рд┐рдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рд╣реИрдВред


рдиреЛрдЯ: рд╕реНрд╡рд┐рдлреНрдЯ 4.2 рдореЗрдВ, @inlinable рдФрд░ @usableFromInline рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬреЛ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝рд░ рдХреЛ рдЕрдиреНрдп рдореЙрдбреНрдпреВрд▓ рд╕реЗ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╢рд╡ рдХреЛ рджреЗрдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдФрд░ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рдмрдирд╛рдирд╛ рд╕рдВрднрд╡ рд╣реИ, рд▓реЗрдХрд┐рди рдореЗрд░реЗ рд╕рд╛рде рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ ( рд╕реНрд░реЛрдд )


рд╕рдВрджрд░реНрдн


  1. рдЬреЗрдирд░рд┐рдХ рдХрд╛ рд╡рд┐рд╡рд░рдг
  2. рд╕реНрд╡рд┐рдлреНрдЯ рдореЗрдВ рдЕрдиреБрдХреВрд▓рди
  3. рд╡рд┐рд╖рдп рдкрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рдФрд░ рдЧрд╣рди рдкреНрд░рд╕реНрддреБрддрд┐ред
  4. рдЕрдВрдЧреНрд░реЗрдЬреА рд▓реЗрдЦ

Source: https://habr.com/ru/post/hi451704/


All Articles