gpt4 book ai didi

objective-c - 如何从 Swift 扩展访问 Objective-C 类的私有(private)成员?

转载 作者:搜寻专家 更新时间:2023-10-31 08:03:29 25 4
gpt4 key购买 nike

我正在尝试在 Swift 中扩展一个 Objective-C 类并使其符合 Equatable 协议(protocol)。这需要访问扩展类的一些 private 成员,编译器不允许我这样做。不公开私有(private)成员的正确方法是什么?

我的 Swift 代码:

import Foundation

extension ShortDate : Equatable { }

public func == (lhs: ShortDate, rhs: ShortDate) -> Bool {
if (lhs.components.year == rhs.components.year)
&& (lhs.components.month == rhs.components.month)
&& (lhs.components.day == rhs.components.day) {
return true;
}
return false;
}

Objective-C :

@interface ShortDate : NSObject<NSCopying, NSCoding> {
NSDate *inner;
NSDateComponents *components; // The date split into components.
}

...

@end

我得到的错误:

ShortDate.swift:26:9: 'ShortDate' does not have a member named 'components'

最佳答案

我在尝试找到一种方法从我们使用的其中一个 SDK 访问类的私有(private)变量时遇到了这个问题。由于我们没有或无法控制源代码,因此我们无法将变量更改为属性。我确实发现以下解决方案适用于这种情况:

extension ObjcClass {
func getPrivateVariable() -> String? {
return value(forKey: "privateVariable") as? String
}

open override func value(forUndefinedKey key: String) -> Any? {
if key == "privateVariable" {
return nil
}
return super.value(forUndefinedKey: key)
}
}

覆盖 value(forUndefinedKey:) 是可选的。如果类中不存在私有(private)变量,value(forKey:) 将崩溃,除非您重写 value(forUndefinedKey:) 并提供默认值。

关于objective-c - 如何从 Swift 扩展访问 Objective-C 类的私有(private)成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26572921/

25 4 0
文章推荐: iOS 图像设计(尺寸和 Assets 目录)
文章推荐: asp.net - 是否可以强制 WebControl 呈现为
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com