【问题标题】:Cannot convert value of type 'NSObject' to expected argument type 'NSObject!'无法将“NSObject”类型的值转换为预期的参数类型“NSObject!”
【发布时间】:2018-06-27 10:47:46
【问题描述】:

我正在将我的整个项目从 Objective-C 转换为 Swift...在转换时我遇到的问题是“无法将 'Facility' 类型的值转换为预期的参数类型“Facility!”

错误在我提到的最后一个转换文件代码中,在评论中提到。

“无法将“Facility”转换为预期的参数类型“Facility!”

代码为:

TheFacility.h 文件:

#import <Foundation/Foundation.h>

@interface FacilityDataModel : NSObject
- (BOOL)save:(Facility *)facility;
@end

TheFacility.m 文件:

#import "FacilityDataModel.h"

@implementation Facility
… // many other methods...

- (void)save
{
    FacilityDataModel *facilityDataModel = [[FacilityDataModel alloc] init];
    [facilityDataModel save:self];
}

… // many other methods...
@end

TheFacilityDataModel.m 文件有方法:

-(BOOL) save: (Facility *) facility
{
    if ([facility m_ID] == nil)
    {
        NSLog(@“Saving Facility Code”);
        return true;
    }
    return false;
}

现在转换为 swift 的“Facility.swift”文件是:

import Foundation

class Facility: NSObject {
    …
    func save() {
        let facilityDataModel = FacilityDataModel() 
        facilityDataModel.save(self) ///Its showing dialog “Cannot convert “Facility” to expected argument type “Facility!”
    }
    …
}

注意:请回复一个不会强迫我更改 Objective-C 代码的解决方案,因为我想让 swift 和 Objective-C 代码一起工作我的项目并且无法更改该 Objective-C 代码。

我现在没有将 DataModel 类转换为 swift ......所以我必须在 swift 中使用这个现有的 Objective-C DataModel 类......并且它也被导入到头文件中......其余所有设置也得到了照顾,很好......除了这个没有其他问题......

【问题讨论】:

  • 在 Swift 中显示 FacilityDataModel 的保存方法
  • 我没有转换数据模型类,所以我只想使用发布的这个 Objective-C 数据模型类...
  • 让设施怎么样:设施! = self 然后 facilityDataModel.save(facility) 这对你有用吗?
  • 显示“无法转换'Facility!'类型的值!”到预期的参数类型'Facility!'”,这更令人困惑......
  • 你在 objc 代码中也有一个类“Facility”声明吗?

标签: swift


【解决方案1】:

看起来你在 objc 代码中有一个同名的类。

您需要重命名其中一个,因为编译器无法解析两个具有相同名称的类

【讨论】:

  • 是的,我尝试了同样的方法,将 swift 类文件重命名为“sFacility.swift”并得到与“无法将 'sFacility' 类型的值转换为预期的参数类型 'Facility!' 相同的错误。 "
  • 确实如此,因为“FacilityDataModel”需要 Facility,而您正在将 sFacility 传递给它 :)
  • 哦,是的,所以我应该重命名目标类或任何其他建议吗?到目前为止,我完全空白......
  • @Nirmal 好的是将 objc 类移动到 swift。在您进行过渡之前,我认为您可以像“class newFacility: Facility”一样快速创建“Facility”的子类并使用它,直到您将整个课程移到那里。
猜你喜欢
  • 2017-01-06
  • 2016-10-04
  • 2015-12-24
  • 2016-10-28
  • 1970-01-01
  • 2016-07-27
  • 2016-07-02
  • 1970-01-01
  • 2016-03-21
相关资源
最近更新 更多