2016-03-31 61 views
17

我可以在Swift中使用扩展实现此功能,而无需继承? 我得到这个错误 扩展可能不包含存储性能扩展可能不包含存储属性

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

} 

回答

32

您可以覆盖的setter /吸气所以它不是一个存储的属性,只是前锋设置/进入图层。

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

     get { 
      return layer.borderWidth 
     } 
    } 
} 
+1

这种技术很有效,但它不会更新xib/storyboard中的UI。 –

+0

设置完成后请执行'setNeedsLayout()'。 –

7

的分机不能添加存储性能。从docs(计算机属性部分):

扩展可以添加新的计算性能,但它们不能添加存储 性能,或添加属性观察员现有的属性。

如果你有需要存储的性能,你应该创建一个子类,像这样:

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

} 
+0

我不想存储变量我想从接口生成器中更改layer.borderWidth –

+0

dan的答案可能适用于您,尽管我担心UIButton可能在getter/setter之前未完全初始化调用。 – Alexander

1

在Swift中,我导入了一个用Objective-C编写的静态库。下面的协议在该库中有一个方法和一个属性。

@class Message; 

@protocol LocalService 

@property (readonly) int action; 

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

@end 

试图有一个类符合该协议,提供下面的信息:

1-)键入 'ShowInitialViewLocalService' 不符合协议“本地服务

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

我希望这会帮助别人。

相关问题