NSObject+MZCExpansion.h

本文介绍了一个NSObject的类别扩展,提供了丰富的实例方法用于类型检查、JSON处理及消息传递等实用功能。
//
//  NSObject+MZCExpansion.h
//  MZCKit
//
//  Created by muzico on 1/9/16.
//  Copyright © 2016 muzico. All rights reserved.
//

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

typedef void(^MZCNSObjectSendSelfMessageBlock)(id object);
typedef void(^MZCNSObjectSendSelfMessage2Block)(id object, id object2);
typedef void(^MZCNSObjectSendSelfMessage3Block)(id object, id object2, id object3);
typedef void(^MZCNSObjectSendSelfMessage4Block)(id object, id object2, id object3, id object4);
typedef void(^MZCNSObjectSendSelfMessage5Block)(id object, id object2, id object3, id object4, id object5);

@interface NSObject (MZCExpansion)

#pragma mark - 判断当前类
- (BOOL) mzcIsClass:(Class) aClass;

- (BOOL) mzcIsNSArray;
- (BOOL) mzcIsNSDictionary;
- (BOOL) mzcIsNSString;
- (BOOL) mzcIsNSURL;
- (BOOL) mzcIsNSData;
- (BOOL) mzcIsNSDate;
- (BOOL) mzcIsNSMutableArray;
- (BOOL) mzcIsNSMutableDictionary;
- (BOOL) mzcIsNSMutableData;
- (BOOL) mzcIsNSError;
- (BOOL) mzcIsNSCoder;
- (BOOL) mzcIsNSSet;
- (BOOL) mzcIsNSMutableSet;
- (BOOL) mzcIsNSNumber;
- (BOOL) mzcIsNSValue;
- (BOOL) mzcIsNSCachedURLResponse;
- (BOOL) mzcIsNSURLResponse;
- (BOOL) mzcIsNSHTTPURLResponse;

- (BOOL) mzcIsUIView;
- (BOOL) mzcIsUIViewController;
- (BOOL) mzcIsUIButton;
- (BOOL) mzcIsUIImageView;
- (BOOL) mzcIsUIWindow;
- (BOOL) mzcIsUIColor;
- (BOOL) mzcIsUIImage;
- (BOOL) mzcIsUIPageControl;
- (BOOL) mzcIsUITextField;
- (BOOL) mzcIsUIScrollView;
- (BOOL) mzcIsUISlider;
- (BOOL) mzcIsUISwitch;
- (BOOL) mzcIsUIProgressView;
- (BOOL) mzcIsUIActivityIndicatorView;
- (BOOL) mzcIsUIStepper;
- (BOOL) mzcIsUIStackView;
- (BOOL) mzcIsUITableView;
- (BOOL) mzcIsUITableViewCell;
- (BOOL) mzcIsUICollectionView;
- (BOOL) mzcIsUICollectionViewCell;
- (BOOL) mzcIsUICollectionReusableView;
- (BOOL) mzcIsUIDatePicker;
- (BOOL) mzcIsUIPickerView;
- (BOOL) mzcIsUIWebView;
- (BOOL) mzcIsUISearchBar;
- (BOOL) mzcIsUIBarButtonItem;
- (BOOL) mzcIsUINavigationBar;
- (BOOL) mzcIsUINavigationItem;
- (BOOL) mzcIsUINavigationController;
- (BOOL) mzcIsUILabel;
- (BOOL) mzcIsUISegmentedControl;
- (BOOL) mzcIsUITextView;
- (BOOL) mzcIsUITapGestureRecognizer;
- (BOOL) mzcIsUILongPressGestureRecognizer;
- (BOOL) mzcIsUIRotationGestureRecognizer;
- (BOOL) mzcIsUIScreenEdgePanGestureRecognizer;
- (BOOL) mzcIsUISwipeGestureRecognizer;
- (BOOL) mzcIsUIPanGestureRecognizer;
- (BOOL) mzcIsUIPinchGestureRecognizer;
- (BOOL) mzcIsUITableViewController;
- (BOOL) mzcIsUISplitViewController;
- (BOOL) mzcIsUIPageViewController;
- (BOOL) mzcIsUITabBarItem;
- (BOOL) mzcIsUITabBarController;
- (BOOL) mzcIsUITabBar;
- (BOOL) mzcIsUISearchController;

#pragma mark - 中文编码
//中文编码 GB_18030_2000
- (NSString*) mzcGB_18030_2000Encoding;


#pragma mark - JSON
- (id) mzcJSONEncoding;
- (NSData*) mzcJSONData;
- (NSString*) mzcJSONString;


- (BOOL) mzcRespondsToSelector:(SEL) aSelector;


- (BOOL) mzcIsEqualToNumberWithChar:(char)value;
- (BOOL) mzcIsEqualToNumberWithUnsignedChar:(unsigned char)value;
- (BOOL) mzcIsEqualToNumberWithShort:(short)value;
- (BOOL) mzcIsEqualToNumberWithUnsignedShort:(unsigned short)value;
- (BOOL) mzcIsEqualToNumberWithInt:(int)value;
- (BOOL) mzcIsEqualToNumberWithUnsignedInt:(unsigned int)value;
- (BOOL) mzcIsEqualToNumberWithLong:(long)value;
- (BOOL) mzcIsEqualToNumberWithUnsignedLong:(unsigned long)value;
- (BOOL) mzcIsEqualToNumberWithLongLong:(long long)value;
- (BOOL) mzcIsEqualToNumberWithUnsignedLongLong:(unsigned long long)value;
- (BOOL) mzcIsEqualToNumberWithFloat:(float)value;
- (BOOL) mzcIsEqualToNumberWithDouble:(double)value;
- (BOOL) mzcIsEqualToNumberWithBool:(BOOL)value;
- (BOOL) mzcIsEqualToNumberWithInteger:(NSInteger)value;
- (BOOL) mzcIsEqualToNumberWithUnsignedInteger:(NSUInteger)value;




- (BOOL) mzcIsEqualToString:(NSString*) aString;
- (BOOL) mzcIsEqualToBool:(BOOL) value;
- (BOOL) mzcIsEqualToInt:(int) value;
- (BOOL) mzcIsEqualToInteger:(NSInteger) value;
- (BOOL) mzcIsEqualToLongLong:(long long) value;
- (BOOL) mzcIsEqualToFloat:(float) value;
- (BOOL) mzcIsEqualToDouble:(double) value;


#pragma mark - 单例化
+ (instancetype) mzcSingleton;

#pragma mark -
#pragma mark - 发送对象自己的信息
- (void) mzcSendSelfMessage;
- (void) mzcSendSelfMessageWithObject:(id)object;

- (void) mzcSendSelfMessage2;
- (void) mzcSendSelfMessage2WithObject:(id)object object2:(id)object2;

- (void) mzcSendSelfMessage3;
- (void) mzcSendSelfMessage3WithObject:(id)object object2:(id)object2 object3:(id)object3;

- (void) mzcSendSelfMessage4;
- (void) mzcSendSelfMessage4WithObject:(id)object object2:(id)object2 object3:(id)object3 object4:(id)object4;

- (void) mzcSendSelfMessage5;
- (void) mzcSendSelfMessage5WithObject:(id)object object2:(id)object2 object3:(id)object3 object4:(id)object4 object5:(id)object5;

#pragma mark - 接收对象自己的信息,并处理
- (void) mzcReceiveSelfMessage:(MZCNSObjectSendSelfMessageBlock)block;
- (void) mzcReceiveSelfMessage2:(MZCNSObjectSendSelfMessage2Block)block;
- (void) mzcReceiveSelfMessage3:(MZCNSObjectSendSelfMessage3Block)block;
- (void) mzcReceiveSelfMessage4:(MZCNSObjectSendSelfMessage4Block)block;
- (void) mzcReceiveSelfMessage5:(MZCNSObjectSendSelfMessage5Block)block;

#pragma mark -
- (void) mzcSendSelfMessage_1;
- (void) mzcSendSelfMessageWithObject_1:(id)object;
- (void) mzcReceiveSelfMessage_1:(MZCNSObjectSendSelfMessageBlock)block;

- (void) mzcSendSelfMessage_2;
- (void) mzcSendSelfMessageWithObject_2:(id)object;
- (void) mzcReceiveSelfMessage_2:(MZCNSObjectSendSelfMessageBlock)block;

- (void) mzcSendSelfMessage_3;
- (void) mzcSendSelfMessageWithObject_3:(id)object;
- (void) mzcReceiveSelfMessage_3:(MZCNSObjectSendSelfMessageBlock)block;

- (void) mzcSendSelfMessage_4;
- (void) mzcSendSelfMessageWithObject_4:(id)object;
- (void) mzcReceiveSelfMessage_4:(MZCNSObjectSendSelfMessageBlock)block;

- (void) mzcSendSelfMessage_5;
- (void) mzcSendSelfMessageWithObject_5:(id)object;
- (void) mzcReceiveSelfMessage_5:(MZCNSObjectSendSelfMessageBlock)block;

@end

你正在开发一个 **Swift 或混合语言的 Framework(HXGPSKit)**,并在其公共头文件 `HXGPSKit.h` 中导入了: ```objc #import "NSData+GZIP.h" ``` 但仍然报错,比如: - `'NSData+GZIP.h' file not found` - 或者构建失败:`Command SwiftVerifyEmittedModuleInterface failed` - 或者模块验证错误、链接错误等 --- ## ✅ 根本原因分析 你在使用 **SPM 引入 `nicklockwood/GZIP`** 的情况下,尝试在 **Framework 的公共头 `.h` 文件中直接引用 SPM 管理的 Objective-C 头文件**,这是不被自动支持的。原因如下: ### 🔴 问题本质: | 原因 | 说明 | |------|------| | 1. ❌ SPM 中的 Objective-C 库不会自动暴露头文件到 umbrella header | 即使你 import "NSData+GZIP.h",Xcode 不知道它属于哪个 module | | 2. ❌ `#import "NSData+GZIP.h"` 是 **project-level import**,不是 module import | 编译器找不到路径 | | 3. ❌ GZIP 使用 `.mm` 文件(Objective-C++),导致无法安全生成 Swift 模块接口 | 触发 `SwiftVerifyEmittedModuleInterface` 错误 | | 4. ❌ Framework 的 umbrella header 不能直接引用 SPM 包中的非 modular headers | 必须通过 module map 显式导出 | --- ## ✅ 正确解决方案(分步操作) 你需要让 **你的 Framework 能正确访问并封装 GZIP 功能**,同时避免破坏模块稳定性。 --- ### ✅ 方案一:【推荐】不要在 `.h` 中暴露 GZIP 接口,仅内部使用(黑盒封装) > 🎯 目标:**隐藏第三方依赖细节,只对外提供纯 Foundation 接口** #### ✅ 步骤 1:移除 `HXGPSKit.h` 中对 GZIP 的导入 ```objc // HXGPSKit.h —— 只保留 framework 自身的声明 #import <Foundation/Foundation.h> //! Project version number for HXGPSKit. FOUNDATION_EXPORT double HXGPSKitVersionNumber; //! Project version string for HXGPSKit. FOUNDATION_EXPORT const unsigned char HXGPSKitVersionString[]; ``` 👉 **不要加**: ```objc // #import "NSData+GZIP.h" ← 删除这行! ``` --- #### ✅ 步骤 2:创建私有包装类(`.h/.mm`)来调用 GZIP ##### 文件:`HXGZIPCompressor.h` ```objc // HXGZIPCompressor.h #import <Foundation/Foundation.h> NS_ASSUME_NONNULL_BEGIN @interface HXGZIPCompressor : NSObject + (NSData * _Nullable)compress:(NSData *)data error:(NSError **)error; + (NSData * _Nullable)decompress:(NSData *)data error:(NSError **)error; @end NS_ASSUME_NONNULL_END ``` ##### 文件:`HXGZIPCompressor.mm` ```objc // HXGZIPCompressor.mm #import "HXGZIPCompressor.h" #import "NSData+GZIP.h" // 这是 SPM 导入的头文件 @implementation HXGZIPCompressor + (NSData * _Nullable)compress:(NSData *)data error:(NSError **)error { return [data gzippedDataWithError:error]; } + (NSData * _Nullable)decompress:(NSData *)data error:(NSError **)error { return [data gunzippedDataWithError:error]; } @end ``` > ⚠️ 注意文件扩展名必须是 `.mm`,因为 `NSData+GZIP.m` 实际上是 Objective-C++(用了 C++ STL) --- #### ✅ 步骤 3:在 Swift 或内部 ObjC 类中使用这个包装器 例如,在 Swift 中: ```swift let compressed = HXGZIPCompressor.compress(data) ``` 或在另一个 `.m/.mm` 文件中引入: ```objc #import "HXGZIPCompressor.h" ``` ✅ 这样你就实现了 **完全隔离 GZIP 实现细节**,且不会污染 public API。 --- #### ✅ 步骤 4:确保 Build Settings 正确 ##### 必须设置: | Build Setting | Value | |---------------|-------| | `BUILD_LIBRARY_FOR_DISTRIBUTION` | `YES` | | `SWIFT_EMIT_MODULE_INTERFACE` | `YES` | | `CLANG_ENABLE_MODULES` | `YES` | | `DEFINES_MODULE` | `YES` | | `ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES` | `YES` | --- #### ✅ 步骤 5:清理缓存后重新构建 ```bash # 清理 DerivedData rm -rf ~/Library/Developer/Xcode/DerivedData/* # 重启 Xcode # Clean Build Folder (Cmd + Shift + K) # Build (Cmd + B) ``` --- ### ✅ 方案二:如果你坚持要在 `.h` 中暴露 GZIP 方法(不推荐) 那你需要做以下复杂配置: #### 1. 手动添加 Module Map 支持(高级) SPM 默认不会为 Objective-C 库生成完整的 module map。你可以手动干预: 在项目根目录创建: ``` Modules/ └── module.modulemap ``` 内容: ```c++ framework module GZIP { header "NSData+GZIP.h" requires objc } ``` 然后在 Build Settings 中设置: ``` IMPORTED_OBJC_FORWARD_HEADER_SEARCH_PATHS = $(PROJECT_DIR)/Modules ``` 但这在 SPM 环境下 **极难生效**,因为 SPM 已经管理了依赖结构。 📌 结论:**不建议走这条路**,维护成本高,容易出错。 --- ### ✅ 方案三:终极推荐 —— 改用 Apple 官方 `Compression` 框架(零依赖) 既然你只是要做 GZIP 压缩,完全可以不用 GZIP 第三方库! #### 替代方案:使用 `compression` API(纯 C,系统级支持) ```swift import Compression extension Data { func gzipped() -> Data? { let dstLen = self.count + (self.count / 8) + 16 var result = Data(count: dstLen) let status = result.withUnsafeMutableBytes { dstBytes in self.withUnsafeBytes { srcBytes in compression_encode_stream( nil, 0, dstBytes.baseAddress!, numericCast(dstLen), COMPRESSION_ZLIB, &gz_end, COMPRESSION_STREAM_FINALIZE ) } } guard status == COMPRESSION_STATUS_OK else { return nil } result.count = Int(status) return result } func gunzipped() -> Data? { var result = Data() var srcIndex = 0 repeat { let chunkSize = 1024 var buffer = [UInt8](repeating: 0, count: chunkSize) let processed = compression_decode_buffer( &buffer, numericCast(buffer.count), self.bytes + srcIndex, numericCast(self.count - srcIndex), nil, COMPRESSION_ZLIB ) if processed <= 0 { break } result.append(&buffer, count: Int(processed)) srcIndex += Int(processed) } while srcIndex < self.count return result.isEmpty ? nil : result } } ``` ✅ 优点: - 无需任何第三方依赖 - 无 Objective-C++ 风险 - 支持 `BUILD_LIBRARY_FOR_DISTRIBUTION` - 可打包成 `.xcframework` - 性能优秀 --- ## ✅ 最终建议架构 ``` HXGPSKit.framework ├── Sources/ │ ├── HXGPSKit.swift → 主 Swift 类 │ ├── HXGZIPCompressor.h → 内部压缩接口(可选) │ ├── HXGZIPCompressor.mm → 调用 GZIP(如果必须用) │ └── Data+Compression.swift → 推荐:用 system compression 替代 ├── Public Headers/ │ └── HXGPSKit.h → 不包含任何第三方头 └── Build Settings: ├── BUILD_LIBRARY_FOR_DISTRIBUTION = YES └── Always Embed Swift Libs = YES ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值