Getter for 'cy_extensionInfo' with Objective-C selector 'cy_extensionInfo' conflicts with getter for 'cy_extensionInfo' from superclass 'UICollectionViewCell' with the same Objective-C selector
结论 :
swfit,java等可以重载方法(也就是可以有同名方法)。OC中不可以造成该现象的原因:
swift在 父类中定义了方法。 又在扩展中定义的同名方法。 swift被OC使用了,会被编译成OC,便造成了错误。
错误代码:
在协议总定义了--cy_extensionInfo
@objc public protocol ListCellProtocol {
/// Extension info of cell, such as indexpath.
var cy_extensionInfo : ListCellExtensionInfo! { get set }
private let cy_extensionInfoKey : String = "cy_extensionInfoKey"
// 在扩展中定义了 -- cy_extensionInfo
extension UITableViewCell : GenericListCellProtocol {
// MARK: - GenericListCellProtocol
typealias ListView = UITableView
typealias ListCell = UITableViewCell
// MARK: - I/F
@objc var cy_extensionInfo : ListCellExtensionInfo! {
set {
objc_setAssociatedObject(self, cy_extensionInfoKey, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
}
get {
return objc_getAssociatedObject(self, cy_extensionInfoKey) as! ListCellExtensionInfo!
}
}
}
// 继承了 UICollectionViewCell 中有 cy_extensionInfo。 子类因为实现 ListCellProtocol所有要加 cy_extensionInfo。 这样子类父类 就会有冲突。
public class DateSelectorCell : UICollectionViewCell, ListCellProtocol {
public var cy_extensionInfo: ListCellExtensionInfo!
解决方法
》 1. 名字重新命名。防止冲突
》 2. 使用 nonobjc 解除 oc 该方法继承关系。
Swift class extensions and categories on Swift classes are not allowed to have +load methods
关于oc的load与initialize :https://www.jianshu.com/p/7cd187f60be0
原因:
Starting from Swift 5 class extensions and categories on Swift classes are not allowed to have +load methods, +initialize doesn’t seem to be prohibited, though.
github第三方库的解决方法: https://github.com/ionic-team/capacitor/pull/1242/commits/8f82d81f41fbe1cbc00a5b8513944d6d078a4c38
stackoverflow的解决方案:https://stackoverflow.com/questions/24898453/swift-objective-c-load-class-method
网友评论