我是Swift的新手,也许这是一个愚蠢的问题,但我无法找到答案。
我创建了一个扩展程序:
extension UITextField {
var placeholderLabel: UILabel {
get {
return self.placeholderLabel
}
set {
self.placeholderLabel = newValue
}
}
}
设置属性后,应用程序崩溃。
答案 0 :(得分:2)
您无法在扩展程序中拥有存储的属性。
不允许扩展将属性添加到现有类,因为添加类的属性结构将会更改。而且由于Objective C,Swift或任何其他编程语言都无法承受,因此它不允许您将存储的属性添加到扩展中。
那时还有什么工作吗?
您可以执行以下操作:将标签保存为扩展程序中的存储属性:)
import Foundation
import UIKit
fileprivate var ascociatedObjectPointer : UInt8 = 99
extension UITextField {
var myLabel : UILabel {
get {
return objc_getAssociatedObject(self, &ascociatedObjectPointer) as! UILabel
}
set {
objc_setAssociatedObject(self, &ascociatedObjectPointer, myLabel, .OBJC_ASSOCIATION_RETAIN)
}
}
}
如何运作?
通过为您正在构成或假装存储属性的变量编写setter和getter,并通过内部保存与现有类无关的指针,简单,因此它不会影响现有结构类。
希望它有所帮助。
答案 1 :(得分:0)
您可以像这样使用NSMapTable
:
extension UITextField {
private static var placeholderLabelMap: NSMapTable<UITextField, UILabel> = .weakToStrongObjects()
var placeholderLabel: UILabel? {
get {
return UITextField.placeholderLabelMap.object(forKey: self)
}
set {
UITextField.placeholderLabelMap.setObject(newValue, forKey: self)
}
}
}
Sandeep的答案的优点可能是线程安全。您可以查看this堆栈溢出主题,以比较两种方法。