[解決済み] Objective-Cと同じように、Swiftでストアドプロパティを持つには?
2022-06-01 13:27:54
質問
私はアプリケーションをObjective-CからSwiftに切り替えていますが、例えば、保存されたプロパティを持ついくつかのカテゴリがあります。
@interface UIView (MyCategory)
- (void)alignToView:(UIView *)view
alignment:(UIViewRelativeAlignment)alignment;
- (UIView *)clone;
@property (strong) PFObject *xo;
@property (nonatomic) BOOL isAnimating;
@end
Swiftの拡張機能はこれらのようなストアドプロパティを受け入れないので、Objcコードと同じ構造を維持する方法を知りません。ストアドプロパティは私のアプリにとって本当に重要で、AppleはSwiftでそれを行うための何らかのソリューションを作成したに違いないと私は信じています。
jouさんがおっしゃるように、私が探していたのは実際に関連するオブジェクトを使うことでしたので、(別の文脈で)そうしました。
import Foundation
import QuartzCore
import ObjectiveC
extension CALayer {
var shapeLayer: CAShapeLayer? {
get {
return objc_getAssociatedObject(self, "shapeLayer") as? CAShapeLayer
}
set(newValue) {
objc_setAssociatedObject(self, "shapeLayer", newValue, UInt(OBJC_ASSOCIATION_RETAIN))
}
}
var initialPath: CGPathRef! {
get {
return objc_getAssociatedObject(self, "initialPath") as CGPathRef
}
set {
objc_setAssociatedObject(self, "initialPath", newValue, UInt(OBJC_ASSOCIATION_RETAIN))
}
}
}
とやっても、EXC_BAD_ACCESSが出ます。
class UIBubble : UIView {
required init(coder aDecoder: NSCoder) {
...
self.layer.shapeLayer = CAShapeLayer()
...
}
}
何かアイデアはありますか?
どのように解決するのですか?
Associated objects APIは使うのが少し面倒です。ヘルパークラスを使って、ほとんどの定型文を削除することができます。
public final class ObjectAssociation<T: AnyObject> {
private let policy: objc_AssociationPolicy
/// - Parameter policy: An association policy that will be used when linking objects.
public init(policy: objc_AssociationPolicy = .OBJC_ASSOCIATION_RETAIN_NONATOMIC) {
self.policy = policy
}
/// Accesses associated object.
/// - Parameter index: An object whose associated object is to be accessed.
public subscript(index: AnyObject) -> T? {
get { return objc_getAssociatedObject(index, Unmanaged.passUnretained(self).toOpaque()) as! T? }
set { objc_setAssociatedObject(index, Unmanaged.passUnretained(self).toOpaque(), newValue, policy) }
}
}
objective-cクラスに、より読みやすい方法でプロパティを "add"することができることを条件とします。
extension SomeType {
private static let association = ObjectAssociation<NSObject>()
var simulatedProperty: NSObject? {
get { return SomeType.association[self] }
set { SomeType.association[self] = newValue }
}
}
解決策としては
extension CALayer {
private static let initialPathAssociation = ObjectAssociation<CGPath>()
private static let shapeLayerAssociation = ObjectAssociation<CAShapeLayer>()
var initialPath: CGPath! {
get { return CALayer.initialPathAssociation[self] }
set { CALayer.initialPathAssociation[self] = newValue }
}
var shapeLayer: CAShapeLayer? {
get { return CALayer.shapeLayerAssociation[self] }
set { CALayer.shapeLayerAssociation[self] = newValue }
}
}
関連
-
[解決済み] SwiftからObjective-Cのコードを呼び出すにはどうしたらいいですか?
-
[解決済み] Swiftを使用してアプリのバージョンとビルド番号を取得するにはどうすればよいですか?
-
[解決済み] Swift で app delegate への参照を取得するにはどうすればよいですか?
-
[解決済み】Swiftで変数の型またはクラスを表示するにはどうすればよいですか?
-
[解決済み】SwiftのコードをObjective-Cにインポートするにはどうすればいいですか?
-
[解決済み】(Swiftで)オブジェクトの型を調べるには?)
-
[解決済み】Swiftでボタンに丸みを帯びたボーダーを付けるにはどうすればいいですか?
-
[解決済み】Objective-Cの"@synchronized "に相当するSwiftは何ですか?
-
[解決済み】コンパイラーエラー。Objective-C のセレクタを持つメソッドは、同じ Objective-C セレクタを持つ以前の宣言と競合しています。
-
[解決済み】Objective-CのisEqualToStringのSwiftに相当するものは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 文字列の長さを取得する
-
[解決済み] Xcode 6のバグ:Interface Builderファイル内の不明なクラス
-
[解決済み] UITextFieldのテキスト変更イベント
-
[解決済み] 「GCC使用時に「Xcode/iOSのライセンスに同意するには管理者権限が必要です。rootでsudoを使用して再実行してください。
-
[解決済み] CocoaPodsの最新バージョンにアップデートしますか?
-
[解決済み] iOS 13でダークモードをオプトアウトすることは可能ですか?
-
[解決済み] iPadマルチタスクのサポートには、これらの方向が必要です。
-
[解決済み] 16進カラーバリューの使用方法
-
[解決済み] Swiftの配列を文字列に変換するには?
-
[解決済み] Swift 3でディスパッチキューを作成する方法