简体   繁体   中英

Extensions May not contain Stored properties

Can I implement this in Swift with Extensions without the need to inheritance?. I get this error Extensions May not contain Stored properties

extension UIButton
{
    @IBInspectable var borderWidth : CGFloat
        {
        didSet{
            layer.borderWidth = borderWidth
        }
    }

}

You can override the setter/getter so that it isn't a stored property and just forwards the set/get to the layer.

extension UIButton {
    @IBInspectable var borderWidth : CGFloat {
        set {
            layer.borderWidth = newValue
        }

        get {
            return layer.borderWidth
        }
    }
}

Extensions cannot add stored properties. From the docs (Computed Properties section):

Note

Extensions can add new computed properties, but they cannot add stored properties, or add property observers to existing properties.

If you have a need for stored properties, you should create a subclass, like so:

class CustomButton : UIButton
{
    @IBInspectable var borderWidth : CGFloat
        {
        didSet{
            layer.borderWidth = borderWidth
        }
    }

}

In Swift, I'm importing a static library written in Objective-C. The protocol below, in that library, has a method and a property.

@class Message;

@protocol LocalService 

@property (readonly) int action;

- (Message *)getResponse:(Message *)request;

@end

Trying to have a class conform to that protocol, delivers the messages below:

1-) Type 'ShowInitialViewLocalService' does not conform to protocol 'LocalService

2-) Extensions may not contain stored properties

The code provided below, fixes this issue:

import UIKit

class ShowInitialViewLocalService: NSObject{

}

extension ShowInitialViewLocalService : LocalService {

    var action: Int32 {
        get { return View.InitialView.rawValue }
    }

    func getResponse(_ request: Message) -> Message {
        let response = Response(source: request.target, target: request.source, relatedView: View.InitialView.rawValue, action: request.action, data: request.data)
        return response
    }
}

I hope this will help someone.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM