Mám nasledujúce otázky týkajúce sa voliteľnej funkcie:
@objc protocol SSRadioButtonControllerDelegate {
/**
This function is called when a button is selected. If "shouldLetDeSelect" is true, and a button is deselected, this function
is called with a nil.
*/
optional func didSelectButton(aButton: UIButton?)
}
- Čo je voliteľná funkcia? Prečo nemusí deklarovať metódu? Na čo slúži?
- prečo
@objc
protokol namiesto@protocol
?
odpovede:
1 pre odpoveď č. 1Protokol informuje delegáta, že ste vybrali tlačidlo UIButton.
Voliteľná metóda tohto protokolu informuje delegáta, ak je tlačidlo vybraté.
Používame @objc atribút, ak chceme v protokole Swift použiť voliteľnú metódu.
@objc protocol SSRadioButtonControllerDelegate: class {
optional func shouldLetDeSelect(sender: SSRadioButtonController) -> Bool
func didSelectButton(sender: UIButton?)
}
To tiež znamená, že štruktúra alebo výčet Swift už nemôžu prijať tento protokol. Ale to nevadí, pretože ste už tento protokol triedy vytvorili.
Atribút @objc sa nezdá byť Swift-y. Takže keď si myslíme, že v protokole Swift potrebujeme voliteľnú metódu, aké sú naše alternatívy?
Presuňte voliteľnú metódu do samostatného protokolu:
protocol SSRadioButtonControllerDelegate: class {
func shouldLetDeSelect(sender: SSRadioButtonController) -> Bool
}
Potom sa môžete prípadne rozhodnúť prijať a implementovať túto novú metódu delegovania do svojho ovládača hlavného pohľadu.
controller.delegate = self
// Uncomment if we need to implement shouldLetDeSelect:
// controller.ButtonSelectionDelegate = self
Ďalším prístupom je poskytnúť predvolenú implementáciu pre „voliteľnú“ metódu v rozšírení. Definíciu protokolu môžeme vyčistiť odstránením atribútov @objc a voliteľných atribútov:
protocol SSRadioButtonControllerDelegate: class {
func shouldLetDeSelect(sender: SSRadioButtonController) -> Bool
func didSelectButton(sender: UIButton?)
}
Metóda je teraz povinná a musí byť niekde implementovaná.
extension SSRadioButtonControllerDelegate {
func shouldLetDeSelect(sender: SSRadioButtonController) -> Bool {
return true
}
}
0 pre odpoveď č. 2
Ak v takomto prípade používate protokoly, trieda, ktorú budete používať, musí vyhovovať protokolu.
protokoly môže vyžadovať konkrétne inštančné metódy a typmetódy, ktoré sa majú implementovať vyhovujúcimi typmi. Tieto metódy sú písané ako súčasť definície protokolu rovnakým spôsobom ako metódy bežnej inštancie a typu, ale bez zložených zátvoriek alebo tela metódy. Variadické parametre sú povolené, platia rovnaké pravidlá ako pre bežné metódy. Predvolené hodnoty však nie je možné určiť pre parametre metódy v rámci definície protokolu.
voliteľný funkcia nie je vyžadovaná pre delegáta konformácie, rovnako ako zobrazenie tabuľky vo vnútri požadovanej metódy a voliteľnej funkcie. Môžete použiť podľa vašich požiadaviek.
Trieda jedna
import UIKit
//Here you creating protocol
@objc protocol MangoDelegate {
func eatmango()
optional func donoteat()
}
class ProtocolController: UIViewController {
var delegate: MangoDelegate?
override func viewDidLoad() {
super.viewDidLoad()
}
}
Trieda druhá tu pomocou protokolu
import UIKit
class ViewController: UIViewController , MangoDelegate {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
//MARK: - delegate method
func eatmango(){
}
}
V tomto kóde používam iba požadovanú funkciu a voliteľný protokol, ktorý nevyhovuje.
bez protokolu o zhode s metódou
@ Pokúste sa tu prispôsobiť protokol s voliteľnou funkciou, ale opäť potrebujete konformáciu
skúste tu s požadovanou funkciou
a skúsil s oboma funkciami
0 pre odpoveď č. 3
Čo je voliteľná funkcia?
A voliteľná funkcia je funkcia deklarovaná v protokole, ktorá nemusí byť implementovaná triedami, ktoré sú v súlade s takýmto protokolom.
Prečo nemusí deklarovať metódu?
Pretože je to voliteľné.
Načo to je?
Príklad je pravdepodobne najlepší spôsob, ako odpovedať na túto otázku.
Máte protokol Bird
.
(Technicky by tento protokol mal byť triedou, bol to však prvý príklad z mojej hlavy.)
V tomto protokole máte povinné údaje eat()
a voliteľné fly()
.
Máte 2 triedy implementujúce protokol Bird
: Dodo
a Eagle
. (Z technického hľadiska by opäť malo ísť o podtriedy triedy Bird, ale toto je iba jednoduchý príklad.)
Dodo
a Eagle
obaja musia implementovať eat()
, pretože oni (dúfajme) obaja jedia.
Pokiaľ však ide o lietanie, orly áno (za predpokladu, že obe krídla sú funkčné), ale dodos don "t. Takže by ste mali implementovať fly()
pre Eagle
ale nie pre Dodo
.
0 pre odpoveď č. 4
Ak sa chcete vyhnúť funkcii @objc, ale stále máte výhodu voliteľných funkcií, jednoducho rozšírite protokol o prázdne (alebo predvolené) implementácie funkcií protokolu, napr. -
protocol MyProtocol: class {
func myFunc()
}
extension MyProtocol {
func myFunc() {
// do nothing (or something...)
}
}
To znamená, že vo svojej triede nemusíte funkciu implementovať