iOS - 在同一个项目中使用 Swift 和 Objective c?

Posted

技术标签:

【中文标题】iOS - 在同一个项目中使用 Swift 和 Objective c?【英文标题】:iOS - use Swift and Objective c at the same project? 【发布时间】:2016-05-19 04:38:48 【问题描述】:

我正在处理一个由iosswift 共同创建的项目。这个项目是一个基于套接字的应用程序。在这个应用程序中,数据存储在数据库中并从那里获取。当我想从表中获取数据时,我将获取数据到 NSManagedObject 类作为模型,当我想使用它们时,从他们的 NSManagedObject 模型中获取它们。我也应该说模型类是客观的c基础!现在,当我想在 swift 类中使用此模型数据并将它们转换为特定类时,会在运行时出错。请给我一个解决方案。这是我的代码:

-(NSMutableArray *)loadBills : (int) estateId : (int) personId 
    NSManagedObjectContext *context = [self managedObjectContext];
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Bill" inManagedObjectContext:context];
    [fetchRequest setEntity:entity];
    NSPredicate *pred = [NSPredicate predicateWithFormat:[NSString stringWithFormat:@"(personId = %d) AND (estateId = %d)",personId,estateId]];
    [fetchRequest setPredicate:pred];
    NSArray *fetchedObjects=[self.managedObjectContext executeFetchRequest:fetchRequest error:nil];
    NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"billId" ascending:NO];
    NSArray *sortedArray = [fetchedObjects sortedArrayUsingDescriptors:@[sort]];
    NSMutableArray *array=[[NSMutableArray alloc]init];
    for (NSManagedObject *info in sortedArray) 
        Bill *bill=(Bill *)info;
        [array addObject:bill];
    //for
    return array;
 //loadBills

用于转换的 Swift 代码是:

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell 
    let cell = collectionView.dequeueReusableCellWithReuseIdentifier("Cell", forIndexPath: indexPath) as! BillCell
    let sa = getBillData().objectAtIndex(indexPath.row) as! Bill
    print(sa.expDate)
    return cell

getBillData() 函数是:

private func getBillData() -> NSMutableArray 
    let dataLayer = DataLayer()
    let person = dataLayer.getCurrentPerson()
    let billArray = dataLayer.loadBills(person.estateId.intValue, person.personId.intValue)
    return billArray

错误是:

无法将“NSManagedObject_Bill_”转换为 Bill。

【问题讨论】:

【参考方案1】:

首先,在cellForItemAtIndexPath函数中从数据库中加载数据是不安全的,也不是一个好习惯,因为每次滚动集合视图时都会调用此函数,而是将Bill对象加载到数组中并设置作为数据源并从该数据源填充单元格。这可能是您获得 nil 对象的另一个原因。

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell 
    let cell = collectionView.dequeueReusableCellWithReuseIdentifier("Cell", forIndexPath: indexPath) as! BillCell
    let sa = getBillData().objectAtIndex(indexPath.row)
    print(sa.valueForKey("expDate")!.description)
    return cell

【讨论】:

您是否尝试过调试并查看“sa”变量得到了什么? 是的……为了什么? @BinMan1,调试并查看变量“sa”得到了什么,它是 nil 吗? 尊敬的投票者,如果有任何投票的理由,请说明,只是投票对任何人都没有帮助。如果有原因,我可以改进答案,这将使遇到这种情况的每个人受益。

以上是关于iOS - 在同一个项目中使用 Swift 和 Objective c?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 语言下使用 iOS Charts API 制作漂亮图表

如何在 Swift 语言下使用 iOS Charts API 制作漂亮图表

Objective C iOS 项目 + Swift 2 WatchOS 项目和 Cocoapods

swift Zero to App:使用Firebase进行开发(适用于iOS - Google I / O 2016)

十大开源Swift库开始你的下一个iOS项目

socket.io-client-swift 包解析在 Xcode13 Beta 项目中失败