Advertisement
Guest User

Untitled

a guest
May 29th, 2017
58
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.04 KB | None | 0 0
  1. import UIKit
  2.  
  3. // Protokoły
  4.  
  5. /*
  6.  
  7. Zdarza się, że zastanawiając się nad dziedziczeniem klas, nie widzimy zbyt dużych relacji pomiędzy nimi. Wtedy na pomoc przychodzą na protokoły
  8.  
  9. Protokoły zawierają jedynie nagłówki metod oraz pola klasy ale nie posiadają żadnego kodu
  10.  
  11. To klasa musi zaimplementować daną metodę chcą jej użyć. Oznacza to napisanie kodu danej metody
  12.  
  13. Protokoły są podobne do klas abstrakcyjnych, czyli tzw. "szkieletu" dla kodu
  14.  
  15. Nie ma możliwości utworzenia obiektu takiego protokołu. Protokoły przypominają interfejsy/klasy abstrakcyjne z języka Java
  16.  
  17. */
  18.  
  19.  
  20.  
  21. // tworzymy protokół zamknij/otwórz
  22.  
  23.  
  24. protocol ProtokolZamknijOtworz
  25. {
  26.  
  27. func zamknij() -> String // piszemy tylko nagłówek takiej metody. Sama implementacja nastąpi w klasie, która będzie chciała zaadoptować taki protokół. Metoda nie posiada żadnego ciała
  28.  
  29.  
  30. func otworz() -> String //jw
  31.  
  32. }
  33.  
  34.  
  35.  
  36.  
  37. class Dom: ProtokolZamknijOtworz //tworzymy klasę Dom, która implementuje protokół ProtokolZamknijOtworz
  38. {
  39.  
  40. func zamknij() -> String // tu piszemy cały kod metody i jest to bezwzględnie wymagane. Metoda właściwa dla Domu
  41. {
  42. return "zamknąłem zamek"
  43. }
  44.  
  45. func otworz() -> String //jw
  46. {
  47. return "otworzyłem zamek"
  48. }
  49. }
  50.  
  51.  
  52.  
  53.  
  54. class Auto: ProtokolZamknijOtworz //tworzymy klasę Auto, która implementuje protokół ProtokolZamknijOtworz
  55. {
  56.  
  57. func zamknij() -> String // tu piszemy cały kod metody i jest to bezwzględnie wymagane. Metoda właściwa dla Auta
  58. {
  59. return "zamknąłem drzwi auta"
  60. }
  61.  
  62. func otworz() -> String //jw
  63. {
  64. return "otworzyłem drzwi auta"
  65. }
  66.  
  67.  
  68. }
  69.  
  70.  
  71.  
  72. // a teraz tworzymy obiekty z każdej klasy sprawdzając czy poprawnie zaimplementowały odpowiednie dla siebie metody
  73.  
  74. let domNaSkarpie = Dom()
  75. domNaSkarpie.otworz()
  76. domNaSkarpie.zamknij()
  77.  
  78.  
  79. let autoOsobowe = Auto()
  80. autoOsobowe.otworz()
  81. autoOsobowe.zamknij()
  82.  
  83.  
  84.  
  85.  
  86.  
  87.  
  88.  
  89.  
  90. // w kolejnym przykładzie pokazuję że protokoły mogą również posiadać właściwości, czyli inaczej pola klasy (składowe) i zobaczymy się one zachowują
  91.  
  92.  
  93. protocol NowyZamknijOtworz
  94. {
  95.  
  96. var zablokowany: Bool {get set} // składowa zadeklarowana ale niezainicjalizowana co zostanie zrobione w klasie która ten protokół będzie adoptować
  97.  
  98. // zmienna var ma specjalne znaczenie - oznacza, że klasa adoptująca protokół musi mieć identycznie nazwaną składową o tym samym typie. Oznacza to że składowa jest obligatoryjna i nie może pominięta. GET oznacza "tylko do odczytu" bądź stałą a SET "do odczytu i zapisu", czyli składową. Jeśli napiszemy GET SET oznacza to, że klasa MUSI zaimplementować taką składową jako zmienną, a jeśli samo GET to jako zmienną var lub stałą let
  99.  
  100.  
  101.  
  102. func zamknij() -> String
  103. func otworz() -> String
  104.  
  105. }
  106.  
  107.  
  108. // tworzymy nową klasę Sejf
  109.  
  110. class Sejf: NowyZamknijOtworz
  111.  
  112. {
  113. var zablokowany: Bool = false //ta składowa jest obligatoryjna w tym miejscu, ze względu że w protokole miała parametry get set, musimy ją oznaczyć jako zmienną var
  114.  
  115.  
  116. func zamknij() -> String
  117. {
  118.  
  119. zablokowany = true
  120. return "zablokowane!"
  121.  
  122. }
  123.  
  124.  
  125. func otworz() -> String
  126. {
  127.  
  128. zablokowany = false
  129. return "odblokowane"
  130.  
  131. }
  132.  
  133. }
  134.  
  135.  
  136.  
  137.  
  138. // tworzymy nową klasę Brama
  139.  
  140. class Brama: NowyZamknijOtworz
  141.  
  142. {
  143. var zablokowany: Bool = false //ta składowa jest obligatoryjna w tym miejscu, ze względu że w protokole miała parametry get set, musimy ją oznaczyć jako zmienną var
  144.  
  145.  
  146. func zamknij() -> String
  147. {
  148.  
  149. zablokowany = true
  150. return "brama zablokowana!"
  151.  
  152. }
  153.  
  154.  
  155. func otworz() -> String
  156. {
  157.  
  158. zablokowany = false
  159. return "brama odblokowana"
  160.  
  161. }
  162.  
  163. }
  164.  
  165.  
  166. let mojSejf = Sejf()
  167. mojSejf.otworz()
  168. mojSejf.zamknij()
  169. mojSejf.zablokowany
  170.  
  171. let mojaBrama = Brama()
  172. mojaBrama.zamknij()
  173. mojaBrama.otworz()
  174. mojaBrama.zablokowany
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement