NSArray的NSAppleEventDescriptor

时间:2015-11-30 06:14:20

标签: objective-c xcode macos cocoa applescript

我尝试使用NSArray的列表值创建NSAppleEventDescriptor。虽然解决方案返回NSString

,但在几年前有人问similar question
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") ]>

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

2 个答案:

答案 0 :(得分:2)

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

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);

答案 1 :(得分:1)

我编写了一个扩展程序,以使其变得更容易。

请注意,atIndex() / descriptorAtIndex:具有基于索引的索引。

extension NSAppleEventDescriptor {

    func listItems() -> [NSAppleEventDescriptor]? {
        guard descriptorType == typeAEList else {
            return nil
        }

        guard numberOfItems > 0 else {
            return []
        }

        return Array(1...numberOfItems).compactMap({ atIndex($0) })
    }

}

请评论或编辑是否可以进行任何改进!