扩展可能不包含存储的属性
Posted
技术标签:
【中文标题】扩展可能不包含存储的属性【英文标题】:Extensions May not contain Stored properties 【发布时间】:2016-03-31 15:20:44 【问题描述】:我可以在不需要继承的情况下在 Swift 中使用 Extensions 实现这一点吗? 我收到这个错误 扩展可能不包含存储属性
extension UIButton
@IBInspectable var borderWidth : CGFloat
didSet
layer.borderWidth = borderWidth
【问题讨论】:
【参考方案1】:您可以覆盖 setter/getter,使其不是存储属性,而只是将 set/get 转发到层。
extension UIButton
@IBInspectable var borderWidth : CGFloat
set
layer.borderWidth = newValue
get
return layer.borderWidth
【讨论】:
此技术有效,但不会更新 xib/storyboard 中的 UI。 设置后做setNeedsLayout()
。【参考方案2】:
扩展无法添加存储属性。来自docs(计算属性部分):
注意
扩展可以添加新的计算属性,但不能添加存储的 属性,或将属性观察器添加到现有属性。
如果您需要存储属性,您应该创建一个子类,如下所示:
class CustomButton : UIButton
@IBInspectable var borderWidth : CGFloat
didSet
layer.borderWidth = borderWidth
【讨论】:
我不想存储变量我想从界面生成器中更改 layer.borderWidth dan 的答案可能对你有用,但我担心UIButton
在调用 getter/setter 之前可能没有完全初始化。【参考方案3】:
在 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
我希望这会对某人有所帮助。
【讨论】:
以上是关于扩展可能不包含存储的属性的主要内容,如果未能解决你的问题,请参考以下文章