問題:次の問題:フレームワーク(インスタンス化できないオブジェクト)を受け取って拡張したい。カテゴリを作るとき、問題はそれが既存のオブジェクトに影響を与えないということです。既存のオブジェクトを拡張する(ISAスウィズリング?)
私はイザスウィズルのことを考えました。だから、isaフィールドが拡張セレクタのリストを指しているようにしてください。しかし、それは可能ではないようですね? (それのための構文?)
誰もそれを行うより良いアプローチを知っていますか?
コードです:
- (void)peripheralManager:(CBPeripheralManager *)peripheral didReceiveWriteRequests:(NSArray<CBATTRequest *> *)requests {
//want to do something that uses the extension
}
そして、私はCBATTRequestを拡張したいです。私は問題がCoreBluetoothにあると思う?
これは私が私のカテゴリを作る方法です。
BLERequestable.h
@protocol BLERequestable <NSObject>
- (nonnull NSString *)getCentralUUID;
- (nonnull NSString *)getCharacteristicUUID;
- (nullable NSData*)getData;
- (void)setData:(nullable NSData *) data;
@end
CBATTRequest + Requestable.h
#import <CoreBluetooth/CoreBluetooth.h>
#import "BLERequestable.h"
@interface CBATTRequest (Requestable) <BLERequestable>
@end
CBATTRequest + Requestable.m
#import "CBATTRequest+Requestable.h"
@implementation CBATTRequest (Requestable)
- (NSString *)getCentralUUID {
return self.central.identifier.UUIDString;
}
- (NSString *)getCharacteristicUUID {
return self.characteristic.UUID.UUIDString;
}
- (NSData*)getData {
return self.value;
}
- (void)setData:(NSData *) data {
self.value = data;
}
@end
そして私は輸入しますカテゴリはどこでも私はそれを使用したい。
「拡張する」と言うときは、「メソッドを追加する」という意味ですか、「既存のメソッドは何を変更するのですか」という意味ですか?前者はカテゴリの機能であり、問題がある場合はコードとエラーを表示します。後者はスウィージングで行うことができますが、非常に危険であり、動作しないケースや、動作しているように見えるかもしれないが微妙に壊れているケース、OSのあるバージョンで動作し、それ以降のバージョンではプロダクションコードでは、これを強く避けるべきです。 –
私はそれにメソッドを追加したいと思います。あなたは正しいです、@ RobNapier。通常、拡張機能を使用する必要があります。この場合、それはしません。私はいくつかのコードで自分の投稿を編集しました。 – MagicMaik
カテゴリーをCBATTRequestにどのように追加していますか? '@interface CBATTRequest(MyExtension)'と '@implementation CBATTRequest'とあなたのコードでなければなりません。それはうまくいくはずです。 –