没有用于使用objective-c分配属性swift 3的setter方法

时间:2016-07-02 15:15:56

标签: ios swift3 xcode8

我在我的一个快速课程中使用下面的代码:

    import UIKit

public class BRUFIMobile: NSObject {

    public var mobileNumber : NSString?
    public var provider : NSString?
    public var aliasName: NSString?
    public var aliasName_en : NSString?
    @objc public var isDefault: Bool

    public override init() {
        self.isDefault = false
        super.init()
    }

}

我的项目包含objective-c和swift代码。代码在xCode 7上工作正常但现在通过更新到xCode 8我得到以下错误:

No setter method 'setIsDefault:' for assignment to property

我在Objective-c代码中使用该属性,如下所示:

   + (BRUFIMobile *) convertUFIMobileToBRUFIMobile:(UFIMobile *) ufimobile
{
    BRUFIMobile *brUFIMobile = [[BRUFIMobile alloc] init];
    brUFIMobile.mobileNumber = ufimobile.number;
    brUFIMobile.provider = ufimobile.provider;
    brUFIMobile.aliasName = ufimobile.aliasName;
    brUFIMobile.aliasName_en = ufimobile.aliasName_en;
    brUFIMobile.isDefault = [ufimobile.isDefault boolValue];

    return brUFIMobile;
}

现在是否需要手动定义seetters?

1 个答案:

答案 0 :(得分:5)

Swift 3 beta对具有领先is的属性进行特殊处理。 对于属性isDefault,Swift生成isDefault作为getter,setDefault:作为setter(不是setIsDefault:)。

在Objective-C代码中使用setDefault:,或将其设为计算属性并手动提供@objc名称。

(加) “使它成为计算属性”意味着:

private var _default: Bool = false
public var isDefault: Bool {
    @objc(isDefault) get {
        return _default
    }
    @objc(setIsDefault:) set {
        self._default = newValue
    }
}

(更新) 据我测试,这似乎有效:

@objc(isDefault) public var isDefault: Bool

比“使其成为计算属性”更简单一些。请试试。

(UPDATE2)

Apple员工已确认“这是一个已知的问题,将在未来的测试版中修复:” https://github.com/apple/swift/pull/3254

这不是核心数据案例。但该修复程序也适用于此问题。 (很遗憾,就像现在一样,Xcode 8 beta 2不包含此修复程序。)

(UPDATE3) 在Xcode 8 beta 3发行说明中说,此功能已被删除,我已确认,没有@objc属性,Objective-C setter setIsDefault:可用于Bool属性{{ 1}}。