- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
在 Swift 中不可能使用 .setValue(..., forKey: ...)
Int
之类的可空类型字段? enum
类型的属性[MyObject?]
对此有一种解决方法,即覆盖对象本身的 setValue forUndefinedKey 方法。
因为我正在编写一个基于反射的通用对象映射器。参见 EVReflection我想尽可能减少这种手动映射。
是否有其他方法可以自动设置这些属性?
可以在我的库中的单元测试中找到解决方法 here这是代码:
class WorkaroundsTests: XCTestCase {
func testWorkarounds() {
let json:String = "{\"nullableType\": 1,\"status\": 0, \"list\": [ {\"nullableType\": 2}, {\"nullableType\": 3}] }"
let status = Testobject(json: json)
XCTAssertTrue(status.nullableType == 1, "the nullableType should be 1")
XCTAssertTrue(status.status == .NotOK, "the status should be NotOK")
XCTAssertTrue(status.list.count == 2, "the list should have 2 items")
if status.list.count == 2 {
XCTAssertTrue(status.list[0]?.nullableType == 2, "the first item in the list should have nullableType 2")
XCTAssertTrue(status.list[1]?.nullableType == 3, "the second item in the list should have nullableType 3")
}
}
}
class Testobject: EVObject {
enum StatusType: Int {
case NotOK = 0
case OK
}
var nullableType: Int?
var status: StatusType = .OK
var list: [Testobject?] = []
override func setValue(value: AnyObject!, forUndefinedKey key: String) {
switch key {
case "nullableType":
nullableType = value as? Int
case "status":
if let rawValue = value as? Int {
status = StatusType(rawValue: rawValue)!
}
case "list":
if let list = value as? NSArray {
self.list = []
for item in list {
self.list.append(item as? Testobject)
}
}
default:
NSLog("---> setValue for key '\(key)' should be handled.")
}
}
}
最佳答案
当我试图解决一个类似的问题时,我找到了解决这个问题的方法——KVO 无法设置纯 Swift 协议(protocol)字段的值。该协议(protocol)必须标记为@objc,这给我的代码库带来了太多痛苦。解决方法是使用 objective-c 运行时查找 Ivar,获取字段偏移量,然后使用指针设置值。此代码适用于 Swift 2.2 中的 Playground :
import Foundation
class MyClass
{
var myInt: Int?
}
let instance = MyClass()
// Look up the ivar, and it's offset
let ivar: Ivar = class_getInstanceVariable(instance.dynamicType, "myInt")
let fieldOffset = ivar_getOffset(ivar)
// Pointer arithmetic to get a pointer to the field
let pointerToInstance = unsafeAddressOf(instance)
let pointerToField = UnsafeMutablePointer<Int?>(pointerToInstance + fieldOffset)
// Set the value using the pointer
pointerToField.memory = 42
assert(instance.myInt == 42)
注意事项:
编辑:https://github.com/wickwirew/Runtime 现在有一个名为Runtime 的框架。它提供了 Swift 4+ 内存布局的纯 Swift 模型,允许它在不调用 Obj C 运行时的情况下安全地计算 ivar_getOffset 的等价物。这允许设置如下属性:
let info = try typeInfo(of: User.self)
let property = try info.property(named: "username")
try property.set(value: "newUsername", on: &user)
在等效功能成为 Swift 本身的一部分之前,这可能是一个很好的前进方式。
关于swift - 使用反射设置对象属性而不使用 setValue forKey,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31589405/
Swift 中的 CKRecord 类规范说明使用 setObject:forKey: 来设置 CKRecord 的值。但是我看到了很多带有 setValue:forKey: 的代码示例,它是 NSV
我使用 let userDefaults = UserDefaults.standard 设置了一些用户默认值,当我检索它们时,我可以使用以下任何一个: jobTextField.text = use
我正在尝试设置 NSMutableDictionary 深处的对象,我的意思是在我可以到达它们之前有几个级别的键。 显然我做不到 setObject:x forKey forKey forKey fo
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: Where's the difference between setObject:forKey: and s
在查看文档时,我几乎看不出有什么大的不同。 “值”和“对象”都是 id 类型,因此可以是任何对象。 Key 曾经是一个字符串,在另一种情况下是一个 id。其中一个似乎保留了该对象,而另一个则没有。还有
由于 forKey 的值是 NSString,我在 Apple 文档中哪里可以找到所有可能值的完整列表?谢谢 最佳答案 方法 addAnimation:forKey: 并没有按照您的想法进行操作。 第
由于UIView动画是由CAAnimation支持的,所以我猜,当id执行UIView animateWithDuration:animations时,CALayer的addAnimation:for
我确信我在尝试编写的一个简单 iPhone 程序中遗漏了一些明显的东西,但代码看起来非常基本,我看不出有什么问题。 我正在尝试使用 NSMutableDictionary 来存储类列表及其关联的保存文
如果我使用dictionaryWithObjects:forKeys:,并且我的键数组恰好有重复项,会发生什么?我认为重复键的最后一个实例将是与该键关联的值;这是正确的吗? 最佳答案 The docs
我在控制台中遇到此崩溃: 2011-08-27 23:26:45.041 App[1672:3117] *** Terminating app due to uncaught exception 'N
This question already has answers here: Swift equivalent to `[NSDictionary initWithObjects: forKeys:
在我的项目中,我创建了一个包含对象和键的字典我为对象和键创建 NSArray 但是当我尝试创建字典时它会发送以下错误: * Terminating app due to uncaught except
这个问题在这里已经有了答案: Sort array into dictionary (5 个答案) 关闭 7 年前。 我有一个名为 animals 的 NSMutableArray。我需要创建一个
我对(例如)UIView 上的setValue:forKey 方法有疑问。 我有以下代码: let label = UILabel() label.layoutMargins = UIEdgeInse
在更改某些 UILabel 的框架时,我有一个神秘的 EXC_BAD_ACCESS。崩溃是随机的,通常我必须重复几分钟的条件。 启用 NSZombies 以及其他内存调试标志(NSDebugEnabl
在 Swift 中不可能使用 .setValue(..., forKey: ...) Int 之类的可空类型字段? 具有 enum 类型的属性 可空对象数组,如 [MyObject?] 对此有一种解决
我尝试使用函数 -setValue:forKey: 并使用 -valueForKey: 获取值 示例: NSArray *rootarr = [[NSArray alloc] init]; NSArr
我很好奇下面的代码片段中的 setValue:forKey: 发生了什么:它只是将指针设置为指向每个数组,类似于... [self setMyArray_1: animalArray]; [self
我的代码给出了一个错误提示 No visible interface for 'NSMutableDictionary' declares the selector 'addObjects:forKe
轨迹是这样的 Application received signal SIGSEGV Stack trace: #0 CoreFoundation 002B
我是一名优秀的程序员,十分优秀!