次のObjective-CコードをSwiftに変換しようとしています。私のObjective-Cコードには、静的メソッドがあり、クラスメソッドからアクセスされます。
_@implementation SomeClass
static NSMutableArray *_items;
+ (void)someMethod {
[_items removeAll];
}
@end
_
Swiftのクラス関数からこのprivate var items = [AnyObject]()
のように宣言された型にアクセスできないため、このためのストアドプロパティを作成しました。
_class var items: [AnyObject] {
return [AnyObject]()
}
_
そして、私はそのようなクラス関数からそのメソッドを呼び出そうとしています。
_class func someFunction() {
items.removeAll(keepCapacity: false)
}
_
しかし、このエラーが発生します「[AnyObject]」型の不変の値には、「removeAll」という名前の変更メンバーのみが含まれます。
このエラーの原因と修正方法を教えてください。
ありがとうございました。
このコードでは:
class var items: [AnyObject] {
return [AnyObject]()
}
格納されたプロパティを作成していません-代わりに計算されたプロパティであり、最悪の部分はそれにアクセスするたびに[AnyObject]
の新しいインスタンスが作成されるため、追加するものはすぐに失われますその参照が範囲外になるため。
エラーについては、静的な計算プロパティは、作成した配列の不変のコピーを本体に返すため、mutating
-およびremoveAll
が1として宣言された配列メソッドは使用できません。そのうちの。不変である理由は、セッターではなくゲッターを定義したためです。
現在Swiftクラスは静的プロパティをサポートしていませんが、構造体はサポートしています-私がよく使用する回避策は内部構造体を定義することです:
class SomeClass {
struct Static {
static var items = [AnyObject]()
}
}
SomeClass.Static.items.append("test")
Static
プロパティを参照するたびにitems
構造体を削除する場合は、ラッパー計算プロパティを定義するだけです。
class var items: [AnyObject] {
get { return Static.items }
set { Static.items = newValue }
}
プロパティに次のように簡単にアクセスできます。
SomeClass.items.append("test")
Swift1.2に更新
Swift1.2 [Xcode6.3]では、キーワードstaticを使用して静的プロパティを宣言できます。また、キーワードクラスまたは静的を使用して静的メソッドを宣言できます。
class SomeClass {
// use static modifier to declare static properties.
static var items: [AnyObject]!
// use class modifier to declare static methods.
class func classMethod() {
items.removeAll(keepCapacity: false)
}
// use static modifier to declare static methods.
static func staticMethod() {
items.removeAll(keepCapacity: false)
}
}
編集:
static
修飾子とclass
修飾子の違いは、static
が単なる「クラス最終」のエイリアスであるため、static
で変更されたメソッドをオーバーライドできないことです。サブクラス。
ありがとう@Maiauxの
それでもSwift 2のマニュアルでは、列挙型構造だけが静的なストアプロパティを使用している可能性があると主張しています。