我在我的一个快速课程中使用下面的代码:
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?
答案 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}}。