2016-03-31 15 views

risposta

32

È possibile ignorare il setter/getter in modo che non è una proprietà immagazzinato e solo in avanti il set/arriva al livello.

extension UIButton { 
    @IBInspectable var borderWidth : CGFloat { 
     set { 
      layer.borderWidth = newValue 
     } 

     get { 
      return layer.borderWidth 
     } 
    } 
} 
+1

Questa tecnica funziona ma non aggiorna l'interfaccia utente nello xib/storyboard. –

+0

Do 'setNeedsLayout()' dopo l'impostazione. –

7

estensioni non possono aggiungere proprietà memorizzati. Dalla (sezione Proprietà computerizzata) docs:

Nota

estensioni possono aggiungere nuove proprietà calcolate, ma non possono aggiungere memorizzati proprietà, o aggiungere gli osservatori di proprietà di proprietà esistenti.

Se avete bisogno di proprietà memorizzate, è necessario creare una sottoclasse, in questo modo:

class CustomButton : UIButton 
{ 
    @IBInspectable var borderWidth : CGFloat 
     { 
     didSet{ 
      layer.borderWidth = borderWidth 
     } 
    } 

} 
+0

Non voglio memorizzare la variabile Voglio cambiare layer.borderWidth dal generatore di interfacce –

+0

La risposta di dan potrebbe funzionare per te allora, anche se la mia preoccupazione è che 'UIButton' potrebbe non essere completamente inizializzato prima che il getter/setter sia invocato. – Alexander

1

In Swift, sto importando una libreria statica scritta in Objective-C. Il protocollo seguente, in quella libreria, ha un metodo e una proprietà.

@class Message; 

@protocol LocalService 

@property (readonly) int action; 

- (Message *)getResponse:(Message *)request; 

@end 

Cercando di avere una classe conforme a quel protocollo, trasporta i messaggi di seguito:

1-) tipo 'ShowInitialViewLocalService' non è conforme al protocollo 'LocalService

2-) Estensioni non può contenere proprietà memorizzate

Il codice fornito di seguito risolve questo problema:

import UIKit 

class ShowInitialViewLocalService: NSObject{ 

} 

extension ShowInitialViewLocalService : LocalService { 

    var action: Int32 { 
     get { return View.InitialView.rawValue } 
    } 

    func getResponse(_ request: Message) -> Message { 
     let response = Response(source: request.target, target: request.source, relatedView: View.InitialView.rawValue, action: request.action, data: request.data) 
     return response 
    } 
} 

Spero che questo aiuti qualcuno.

Problemi correlati