2015-07-29 12 views
6

Ok, quindi abbiamo UIScrollView dichiarazione:proprietà delegato con diverso tipo a Swift

protocol UIScrollViewDelegate: NSObjectProtocol { ... } 
class UIScrollView: UIView { 
    ... 
    weak var delegate: UIScrollViewDelegate? 
    ... 
} 

E poi UITableView con delegate variante?

protocol UITableViewDelegate: NSObjectProtocol, UIScrollViewDelegate { ... } 
class UITableView: UIScrollView { 
    ... 
    weak var delegate: UITableViewDelegate? 
    ... 
} 

Come ha fatto Apple? Quando faccio il mio

protocol MyScrollViewSubclassDelegate: NSObjectProtocol, UIScrollViewDelegate { ... } 
class MyScrollViewSubclass: UIScrollView { 
    ... 
    weak var delegate: MyScrollViewSubclassDelegate? 
    ... 
} 

ottengo Proprietà 'delegato' con il tipo 'MyScrollViewSubclassDelegate?' non è possibile sovrascrivere una proprietà con tipo 'UIScrollViewDelegate?'.

+0

Cosa succede se si imposta la sottoclasse su UITableView. classe MyScrollViewSubclass: UITableView – jarryd

+0

Stesso problema ... –

+0

Hai provato le estensioni del protocollo in Swift 2.0? – jarryd

risposta

2

MyScrollViewSubclass ha la proprietà delegata di UIScrollView perché è sottoclasse di UIScrollView.

Poiché delegate è già definito da UIScrollView, non è possibile definire lo stesso nome di proprietà con un nuovo tipo.

Modificare il nome variabile delegate in myDelegate (o altro) e dovrebbe funzionare.

+0

Questo mi è bastato per risolvere il problema. – Fra

3

Sono inciampato su questo un paio di volte e l'unica soluzione che ho trovato è stata solo chiamare la mia proprietà qualcos'altro come CustomDelegate o qualsiasi altra cosa ti piaccia.

Sarebbe davvero bello poterlo chiamare delegato ma hey!

+0

Lo stesso qui. Ma ... oggi ho capito che Apple lo fa. E sono solo seriamente curioso di sapere come! –

+0

Hai provato un delegato var non associato (non sicuro): MyScrollViewSubclassDelegate? '? Questo è ciò che vedo nella sorgente di UITableView. – Skoua

+0

Vedo 'debole' lì. O 'unowned' non può essere applicato al tipo non di classe 'MyScrollViewSubclassDelegate?'. –

0

Ho ottenuto questo funzionamento, ma non mi piace molto la soluzione poiché getta via il controllo del tipo.

Quello che ho fatto è stato questo. Nella mia classe di base ho dichiarato il delegato come

weak var delegate: AnyObject? = nil 

Poi, quando voglio chiamare un metodo sul delegato che faccio

if let delegate = self.delegate as? MyBaseClassProtocol { delegate.myMethod() } 

Nel mio sottoclasse Posso quindi anche fare lo stesso genere di cose

if let delegate = self.delegate as MySubclassProtocol { delegate.mySubclassMethod() } 

Come ho detto, funziona, ma non mi piace molto. A mio avviso, buttare via il macchinario non deve essere fatto alla leggera. Sto solo condividendo la speranza che qualcuno con più forti abilità Swift possa migliorarlo o correggerlo.

Problemi correlati