Mi SuerClass es UICollectionViewCellque tiene una propiedad:

var selected: Bool

Mi clase es

MyClass : UICollectionViewCell {

  func setSelected(selected: Bool) { 
    super.selected = selected
    //do something
 }

}

El ex funcionado bien en XCode 6.2 pero en XCode 6.3Beta2 genera un error:

Method 'setSelected' with Objective-C selector 'setSelected:' conflicts with setter for 'selected' from superclass 'UICollectionViewCell' with the same Objective-C selector

Cómo puedo solucionar este problema para trabajar con XCode 6.3 beta2?

Edit: también he intentado

  override func setSelected(selected: Bool) { 
    super.selected = selected
    //do something
 }

Esto lleva a que el error:

Method does not override any method from its superclass
¿El uso de la overrides palabra clave? Se intenta reemplazar como una propiedad?
override no funciona véase mi edición.

OriginalEl autor confile | 2015-03-14

1 Comentario

  1. 41

    Si todos lo queremos hacer algunas funcionalidades extra después de la selected de la propiedad, como se ha establecido, se puede simplemente reemplazar para agregar una propiedad observador:

    override var selected: Bool {
        didSet {
            if self.selected {
                //do something
            }
        }
    }

    Si nos preocupamos por lo que el valor anterior de selected fue, podemos acceder a ella a través de oldValue:

    didSet {
        if self.selected == oldValue {
            return
        }
        //do something
    }

    Y no olvides, podemos utilizar willSet así si tenemos que hacer algo justo antes de que se cambia el valor.


    Estaba curioso por saber lo que iba a suceder cuando tenemos una gran jerarquía de clases de cada adición de sus propias cosas en willSet y didSet propiedad de los observadores, por lo que he creado la siguiente prueba:

    class ClassA {
        var _foo: Int = 0
        var foo: Int {
            set(newValue) {
                println("Class A setting foo")
                self._foo = newValue
            }
            get {
                return self._foo
            }
        }
    }
    
    class ClassB: ClassA {
        override var foo: Int {
            willSet {
                println("Class B will set foo")
            }
            didSet {
                println("Class B did set foo")
            }
        }
    }
    
    class ClassC: ClassB {
        override var foo: Int {
            willSet {
                println("Class C will set foo")
            }
            didSet {
                println("Class C did set foo")
            }
        }
    }

    Ahora, si queremos crear un objeto de ClassC y establecer su foo propiedad:

    var c: ClassC = ClassC()  
    c.foo = 42

    Se obtiene el siguiente resultado:

    Class C will set foo
    Class B will set foo
    Class A setting foo
    Class B did set foo
    Class C did set foo

    Así, es importante tener en cuenta un par de cosas de este…

    • Un niño de la clase willSet se llama antes de sus padres willSet.
    • Un niño de la clase didSet se llama después de sus padres didSet.
    • La creación de un reemplazo para el bien de la adición de la propiedad de los observadores no reemplazar cualquier propiedad en calidad de observadores en las clases para los padres.

    Los dos primeros puntos que un poco de sentido. Y en realidad, esto hace que la propiedad de los observadores mucho más atractivo. Efectivamente, Swift fuerzas de nuestra mano en ir arriba y abajo en la jerarquía de la manera adecuada y muy bien la divide en dos métodos diferentes. Swift también nos impide a nosotros (creo) de reemplazar una clase padre de la propiedad, pero también que aún nos permite observar los cambios a la propiedad-esto es mucho mejor que Objective-C del enfoque.

    Pero el tercer punto es probablemente el más importante. Ser cuidadoso-usted puede conseguir fácilmente empantanado en una enorme jerarquía de didSet y willSet código que la ralentización de lo que debería ser bastante rápido proceso: establecer el valor de una propiedad.

    OriginalEl autor nhgrif

Dejar respuesta

Please enter your comment!
Please enter your name here