swift问题

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

你可能感兴趣的:(swift问题)