web-dev-qa-db-ja.com

拡張機能には、格納されたプロパティが含まれない場合があります

これをSwiftを継承なしで拡張機能とともに使用して実装できますか?。

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

}
30

Setter/getterをオーバーライドして、保存されたプロパティではなく、set/getをレイヤーに転送するだけです。

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

        get {
            return layer.borderWidth
        }
    }
}
53
dan

拡張機能は、保存されたプロパティを追加できません。 docs (Computed Propertiesセクション)から:

注意

拡張機能は、計算された新しいプロパティを追加できますが、保存されたプロパティを追加したり、既存のプロパティにプロパティオブザーバを追加したりすることはできません。

格納されたプロパティが必要な場合は、次のようにサブクラスを作成する必要があります。

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

}
10
Alexander

Swiftでは、Objective-Cで記述された静的ライブラリをインポートしています。そのライブラリの以下のプロトコルには、メソッドとプロパティがあります。

@class Message;

@protocol LocalService 

@property (readonly) int action;

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

@end

クラスをそのプロトコルに準拠させようとすると、以下のメッセージが配信されます。

1-)タイプ 'ShowInitialViewLocalService'はプロトコル 'LocalServiceに準拠していません

2-)拡張機能には保存されたプロパティが含まれていない可能性があります

以下に示すコードは、この問題を修正します。

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
    }
}

これが誰かの助けになることを願っています。

3
Emre Gürses