2017-10-16 3 views
1

Voici une situation que nous avons vu en passant de Xcode 8 à 9 (Swift 3.1-> Swift 3.2/4). C'est un cas fréquent d'avoir un en-tête public qui a des propriétés en lecture seule et des en-têtes privés avec des définitions en lecture/écriture ainsi que du code Swift (tests unitaires dans ce cas, mais simplement un projet mixte ObjC/Swift) les setters. J'ai pensé que je partagerais comment nous avons résolu ceci.Setter privé en Objective-C, accédant à partir de Swift 3.2+

Classe principale:

Objective-C en-tête

@interface SomeClass : NSObject { 
    @property (nonnull, nonatomic, readonly) SomeOtherClass* var; 
} 
@end 

Ensuite, nous avons un en-tête privé:

Objective-C en-tête

@interface SomeClass (Testing) { 
    @property (nonnull, nonatomic, readwrite) SomeOtherClass* var; 
} 
@end 

Le n dans un en-tête Bridging, nous incluons à la fois l'en-tête d'origine et l'en-tête privé. En utilisant Xcode 8 (Swift 3.1), cela a bien fonctionné. Dans Xcode 9 (Swift 3.2/4), nous obtenons une erreur que la propriété est en lecture seule.

Répondre

2

Ce qui a fonctionné pour nous:

Modifier l'en-tête d'essai privé à utiliser:

@protocol SomeClassTesting <NSObject> 
    @property (nonnull, nonatomic, readwrite) SomeOtherClass* var; 
@end 

@interface SomeClass (Testing) <SomeClassTesting> 
@end