如何从NSArray访问属性?

时间:2016-01-08 21:51:07

标签: ios objective-c swift

我从JSON格式的MySQL数据库中获取数据。在Objective-C文件中,数据被修改并放入 NSMutableArray (“ _data ”)。通过函数“ itemsDownloaded ”,一旦从数据库下载完成并接收到“_data”-array,代理就会收到通知。

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
// Create an array to store the data
NSMutableArray *_data = [[NSMutableArray alloc] init];

// Parse the JSON that came in
NSError *error;
NSArray *jsonArray = [NSJSONSerialization JSONObjectWithData:_downloadedData options:NSJSONReadingAllowFragments error:&error];

// Loop through Json objects, create question objects and add them to our questions array
for (int i = 0; i < jsonArray.count; i++)
{
    NSDictionary *jsonElement = jsonArray[i];

    // Create a new data object and set its props to JsonElement properties
    Data *newData = [[Data alloc] init];
    newData.sozialversicherungsnummer = jsonElement[@"Sozialversicherungsnummer"];
    newData.messzeitpunkt = jsonElement[@"Messzeitpunkt"];
    newData.puls = jsonElement[@"Puls"];
    newData.sauerstoffgehalt = jsonElement[@"Sauerstoffgehalt"];

    // Add this question to the locations array
    [_data addObject:newData];

}

// Ready to notify delegate that data is ready and pass back items
if (self.delegate)
{
    [self.delegate itemsDownloaded:_data];
}

}

我的目标是访问“newData”的属性“sozialversicherungsnummer”,“messzeitpunkt”,“puls”和“sauerstoffsättigung”(在上面的文件中)。 “数据”类定义了这四个属性。

现在我想在 swift文件中的图表中显示这些属性。例如,我想在x轴上显示“messzeitpunkt”,在y轴上显示“puls”。我知道如何处理图表,但我的问题是我不知道如何访问swift文件中的属性。

如果我将这些行写入swift文件:

var data: NSArray = [];
func itemsDownloaded(items: [AnyObject]!) {
data = items
print("\(data)")
}

我在输出中得到了这个:

(
"<Data: 0x7ca5ff60>",
"<Data: 0x7ca5dab0>",
"<Data: 0x7be497e0>",
"<Data: 0x7ca42c00>"
)

有人可以帮助我吗?

1 个答案:

答案 0 :(得分:2)

问题在于你不需要NSArray。斯威夫特不知道NSArray里面有什么。你想要一个 Swift 数组,即[Data]。这样,Swift知道每个项目都是数据,您可以访问其属性。

您的输出是:

(
"<Data: 0x7ca5ff60>",
"<Data: 0x7ca5dab0>",
"<Data: 0x7be497e0>",
"<Data: 0x7ca42c00>"
)

这正是你想要和期待的!您有一个包含四个Data对象的数组。唯一的问题是你忘了告诉Swift这件事。您需要将数组键入[Data]或将其转换为[Data]

例如,您现在要说的是:

func itemsDownloaded(items: [AnyObject]!) {
    data = items
    print("\(data)")
}

试着说:

func itemsDownloaded(items: [AnyObject]!) {
    let datas = items as! [Data]
    datas.forEach {print($0.messzeitpunkt)}
}

这是合法的,因为现在你告诉Swift数组中的内容。您将看到您的数据完全符合您的预期。