美文网首页
swift问题

swift问题

作者: toro宇 | 来源:发表于2020-03-10 17:34 被阅读0次
    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问题

          本文链接:https://www.haomeiwen.com/subject/sxlgdhtx.html