blog

Swift-Extension ストレージ属性を追加する

Swiftでは、拡張機能で "格納属性 "を直接追加することはできません。しかし、実際には、拡張機能を使用して既に作成されたクラスに新しい格納属性を追加するために使用されることがよくあります。例えば、...

Dec 5, 2020 · 1 min. read

Swift では、ストアド属性をエクステンションに直接追加することはできません。しかし、現実の世界では、すでに作成されたクラスに新しいストアド属性を追加するために拡張機能を使用することは一般的です。例えば、異なる UIView インスタンスを区別するために、UIView クラスに identifier 属性を追加します。

Extensions must not contain stored propertiesUIViewの拡張子で直接追加すると、コンパイラは.NET Frameworkを報告します。下図のようになります:

ストレージ属性の識別子を直接定義することはできないので、アソシエーション属性を使って目的の機能を実現します。コードは以下のようになります:


public extension UIView {
 private struct AssociatedKey {
 static var identifier: String = "identifier"
 }
 
 public var identifier: String {
 get {
 return objc_getAssociatedObject(self, &AssociatedKey.identifier) as? String ?? ""
 }
 
 set {
 objc_setAssociatedObject(self, &AssociatedKey.identifier, newValue, .OBJC_ASSOCIATION_COPY_NONATOMIC)
 }
 }
}
import UIKit
class ViewController: UIViewController {
 override func viewDidLoad() {
 super.viewDidLoad()
 print("view's identifier:\(self.view.identifier)")
 view.identifier = "root view"
 print("view's identifier:\(self.view.identifier)")
 }
}
Result: ----------------------
view's identifier:
view's identifier:root view
Read next

Maven設定リポジトリ

会社のMavenプロジェクトの開発過程では、通常、ローカルのMavenの設定構成を統一し、すべての人のプロジェクトが同じアドレスから取得できるようにします。実際には、多くのオープンソースプロジェクトは、pom.xmlの設定に追加されます、例えば、次のオープンソースプロジェクトの設定です:このような設定の役割は、すべての方向から学習者が取ることです...

Dec 5, 2020 · 1 min read