what english chocolate cocoa properties categories

cocoa - english - Agregar propiedad BOOL a través de una categoría



cocoa wikipedia (6)

En aras de la integridad, así es como funcionó esto:

@interfaz

@interface ClassName (CategoryName) @property (readwrite) BOOL boolProperty; @end

@implementación

#import <objc/runtime.h> static char const * const ObjectTagKey = "ObjectTag"; @implementation ClassName (CategoryName) - (void) setBoolProperty:(BOOL) property { NSNumber *number = [NSNumber numberWithBool: property]; objc_setAssociatedObject(self, ObjectTagKey, number , OBJC_ASSOCIATION_RETAIN); } - (BOOL) boolProperty { NSNumber *number = objc_getAssociatedObject(self, ObjectTagKey); return [number boolValue]; } @end

Esta pregunta ya tiene una respuesta aquí:

Estoy usando una categoría NSAttributedString (Additions) y realmente necesito una forma de agregar una propiedad que sea un BOOL (que indica si la cadena es una etiqueta HTML o no). Sé que las categorías no deberían tener propiedades, pero esa es la forma en que necesito hacerlo. Me cansé de escribir mis propios captadores y setters pero no funcionó. ¿Cómo puede funcionar esto?


Las categorías pueden tener propiedades de solo lectura, simplemente no puede agregar variables de instancia con ellas (bueno, puede, más o menos - ver referencias asociativas).

Puede agregar un método de categoría (presentado por una propiedad de solo lectura) isHTMLTag que devolvería un BOOL, solo tendría que calcular si era una etiqueta HTML cada vez dentro de ese método.

Si está solicitando una manera de establecer el valor BOOL, entonces necesitará usar referencias asociadas ( objc_setAssociatedObject ) que nunca he usado, así que no se sienta calificado para responder con más detalle.


Mi solución sin la necesidad de una clave de objeto y un poco más fácil de leer la sintaxis

NSString + Helper.h

#import <Foundation/Foundation.h> @interface NSString (Helper) @property (nonatomic, assign) BOOL isHTML; @end

NSString + Helper.h

#import "NSString+Helper.h" #import "objc/runtime.h" @implementation NSString (Helper) - (void)setIsHTML:(BOOL)isHTML { NSNumber *isHTMLBool = [NSNumber numberWithBool:isHTML]; objc_setAssociatedObject(self, @selector(isHTML), isHTMLBool, OBJC_ASSOCIATION_RETAIN_NONATOMIC); } - (BOOL)isHTML { NSNumber *isHTMLBool = objc_getAssociatedObject(self, @selector(isHTML)); return isHTMLBool.boolValue; } @end


Probablemente muy tarde en este mundo, cuando Swift ya es un gran objetivo c. De todos modos, con Xcode 8, también puede usar propiedades de clase, en lugar de usar referencias asociativas.

@interface ClassName (CategoryName) @property (class) id myProperty; @end @implementation static id *__myProperty = nil; + (id)myProperty { return __myProperty; } + (void)setMyProperty:(id)myProperty { __myProperty = myProperty; }

@fin

De las notas de lanzamiento de Xcode 8:

Objective-C ahora admite propiedades de clase, que interactúan con las propiedades de tipo Swift. Se declaran como: @property (clase) NSString * someStringProperty ;. Nunca se sintetizan. (23891898)


Si realmente necesita agregar una propiedad, debe crear una subclase en lugar de agregar una categoría.


Swift 3:

Usando este método, puede agregar cualquier propiedad nueva (aquí agregue valor Bool) a la clase emocionante.

import ObjectiveC private var xoAssociationKey: UInt8 = 0 extension <ClassName> { var <propertyName>: Bool! { get { return objc_getAssociatedObject(self, &xoAssociationKey) as? Bool ?? false } set(newValue) { objc_setAssociatedObject(self, &xoAssociationKey, newValue, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN) } } }