gpt4 book ai didi

ios - 如何在 Swift 中访问 iOS 私有(private) API?

转载 作者:IT王子 更新时间:2023-10-29 05:21:01 35 4
gpt4 key购买 nike

如何从 Swift 调用非公共(public) iOS 函数和访问非公共(public)属性?具体来说,我想在 QuartzCore 框架中使用一个非公共(public)类。

我想到的一个解决方案是创建“桥接”Objective-C 项目,将此非公共(public) API 包装到公共(public) API 中,然后从 Swift 调用此 Objective-C 函数。但是,我的解决方案现在是纯 Swift,我更愿意保持这种状态。还有更稳妥的方法吗? (例如向 Objective-C bridging header file 添加内容)

注意:我知道您在想什么,私有(private) API 是私有(private)的,因为它们不应该被使用。我知道风险,我知道所有不利因素、应用商店限制等。经过仔细考虑和大量研究,不幸的是,在这种特殊情况下,它似乎仍然是最好的方法。

最佳答案

如果您的项目在 objective-C 。

创建一个头文件并将类别的声明放在类上,以及您希望公开的私有(private)方法的声明。然后,告诉 Swift 编译器导入这个桥接 header 。

出于演示目的,我将探索 NSBigMutableString 的内部结构,它是 NSMutableString 的私有(private)子类,我将调用它的 _isMarkedAsImmutable 方法。

请注意,这里整个类本身都是私有(private)的,因此我必须先将其声明为其真正父类(super class)的子类。因此,我也可以在类本身的声明中声明该方法;然而,这并没有展示 (Private) 技巧类别的用法。

如果您的类是公开的,那么显然您只需要类别,而无需(重新)声明类本身。

桥.h:

#import <Foundation/Foundation.h>

@interface NSMutableString (Private)
- (BOOL)_isMarkedAsImmutable; // this is a lie
@end

@interface NSBigMutableString : NSMutableString
@end

s.swift:

let s = NSBigMutableString()
println(s._isMarkedAsImmutable())

编译运行:

$ xcrun -sdk macosx swiftc -o foo -import-objc-header Bridge.h s.swift
$ ./foo
false
$

关于ios - 如何在 Swift 中访问 iOS 私有(private) API?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28174541/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com