NSAppleEventDescriptor 到 NSArray

问题描述 投票:0回答:2

我正在尝试使用

NSArray
中的列表值创建
NSAppleEventDescriptor
。几年前有人问过一个类似的问题,尽管解决方案返回了
NSString

NSString *src = [NSString stringWithFormat: @"return {\"foo\", \"bar\", \"baz\"}\n"];
NSAppleScript *exe = [[NSAppleScript alloc] initWithSource:src];
NSAppleEventDescriptor *desc = [exe executeAndReturnError:nil];

NSLog(@"%@", desc);

// <NSAppleEventDescriptor: [ 'utxt'("foo"), 'utxt'("bar"), 'utxt'("baz") ]>

我不确定我需要什么描述符函数来将值解析为数组。

objective-c xcode macos cocoa applescript
2个回答
5
投票

返回的事件描述符必须强制为列表描述符。
然后你可以通过重复循环获取值。

NSString *src = [NSString stringWithFormat: @"return {\"foo\", \"bar\", \"baz\"}\n"];
NSAppleScript *exe = [[NSAppleScript alloc] initWithSource:src];
NSAppleEventDescriptor *desc = [exe executeAndReturnError:nil];
NSAppleEventDescriptor *listDescriptor = [desc coerceToDescriptorType:typeAEList];
NSMutableArray *result = [[NSMutableArray alloc] init];
for (NSInteger i = 1; i <= [listDescriptor numberOfItems]; ++i) {
    NSAppleEventDescriptor *stringDescriptor = [listDescriptor descriptorAtIndex:i];
    [result addObject: stringDescriptor.stringValue];
}
NSLog(@"%@", result);

5
投票

我编写了一个扩展来使这更容易。

请注意

atIndex()
/
descriptorAtIndex:
具有基于 1 的索引

extension NSAppleEventDescriptor {
    
    func listItems() -> [NSAppleEventDescriptor]? {
        guard descriptorType == typeAEList else { return nil }
        guard numberOfItems > 0 else { return [] }
        return Array(1...numberOfItems).compactMap({ atIndex($0) })
    }
    
}

如有需要改进的地方请评论或编辑!

© www.soinside.com 2019 - 2024. All rights reserved.