web-dev-qa-db-ja.com

Swift)でタイプUnsafeMutablePointerObjCBool​​の値を割り当てることができません

私はObjectiveCに慣れていません。

私はプライベートフレームワークを使用しており、Swiftコード内からプロパティの1つを変更できる必要があります。

プロパティは、ObjectiveCで次のように宣言されます。

@property (nonatomic, assign) BOOL *isSSNField;

in Swiftこのようにプロパティの値を変更しようとしています:

myClass.isSSNField = true

このエラーが発生します

Cannot assign a value of type 'Bool' to a value of type 'UnsafeMutablePointer<ObjcBool>'

ここからどこに行けばいいのか、なぜこのエラーが発生するのかわかりません

14
YichenBman

私はあなたが説明するような状況を見たことがありません。個人的には、その状況は存在しないと言いたくなります。私の人生でObjective-CでBOOL*プロパティまたはivarを見たことがありません(そして私は年をとっています、信じてください)。ただし、次のように主張する場合:私はこれをテストしていませんが、次のように言うことができると思います。

var ok = UnsafeMutablePointer<ObjCBool>.alloc(1)
ok[0] = false // or true
let val = ok
myClass.isSSNField = val

ただし、それはcompileになると思いますが、doingの意味についてはかなりわかりません。宇宙がブラックホールに崩壊する可能性があるので注意してください。

20
matt

Swift 3.1の更新

ポインタタイプの場合Swiftはpointeeプロパティを提供し、

Documentation for v3.1は、このポインタによって参照されるインスタンスにアクセスするために使用されることを示しています

ポインティフィールドを簡単に設定できます

myClass.isSSNField.pointee = false

そして、これはすべてのポインター型と変換で同じです。 ObjectiveCの値を確認したい場合BOOL*簡単にできます

if myClass.isSSNField.pointee.boolValue
17
accfews

Objective-CのBOOL *はBoolのポインタです。
SwiftでUnsafeMutablePointerを使用します。

var isSSNField: ObjCBool = true
myClass.isSSNField = &isSSNField

次に、それを修正します。

関数のisDirectoryパラメーターと同じように:

func fileExists(atPath path: String, isDirectory:UnsafeMutablePointer<ObjCBool>?) -> Bool

次のコードを使用できます。

var isDirectory:ObjCBool = true
var isFileExists = FileManager.default.fileExists(atPath: <#YourPath#>, isDirectory: &isDirectory)
7
TanJunHao

これを処理するためのより安全な方法は、@ TanJunHaoの回答と非常によく似ています。

var isSSNField = ObjCBool(true)
myClass.isSSNField = &isSSNField
4
FromTheStix

ObjectiveCのプロパティ宣言が正しくないようです。以下のように更新してお試しください

@property (nonatomic, assign)BOOL isSSNField;
0
Vinu David Jose