2017-03-20 7 views
1
 let parent = path[row-1] 
     let child = path[row] 

     let indexOfChild = matrix[parent.objectId!]!.index(of: child) 

     print("indexOfChild = \(indexOfChild)") 
     print("keyValuePair = \(matrix[parent.objectId!]!)") 
     print("child = \(child)") 

     let indexAfter = matrix[parent.objectId!]!.index(after: indexOfChild!) 

この情報はコンソールに表示されています。Swift - objectIdが正確であっても、カスタムオブジェクトはゼロになります。

"child"(これはargumentText: "example"の引数オブ​​ジェクト)がkeyValuePairに存在することがわかります(同じobjectIdを持ちます)。それでも、keyValuePairのインデックスはコンソールには表示されません。どうやら、単なる違いは、「子」は「0x608000333f60」の隣にあり、keyValuePairの第2引数オブジェクトは「0x600000321a40」です。

私はこれらの目的およびそれらがどのように計算されますを知らないが、これらのコードが互いに

異なっているので、インデックスがnilを発見された私は、あまりにものためにそれを修正しようとしているように思えます今は長い。誰かが私を助けてくれますか?


indexOfChild = nil 
 
keyValuePair = [<Argument: 0x608000334e60, objectId: IG9ekqMRw9, localId: (null)> { 
 
    ACL = "<PFACL: 0x60800042f200>"; 
 
    argumentText = "the only thing is I can't get over how I feel when it "; 
 
    creatorId = hWRXoRvnYd; 
 
    level = 4; 
 
    parentId = j7GkpwUKsm; 
 
    reach = 0; 
 
    threadId = Dtq632QYJ2; 
 
}, <Argument: 0x600000321a40, objectId: 56AsB1juNP, localId: (null)> { 
 
    ACL = "<PFACL: 0x600000235440>"; 
 
    argumentText = "example "; 
 
    creatorId = hWRXoRvnYd; 
 
    level = 4; 
 
    parentId = j7GkpwUKsm; 
 
    reach = 0; 
 
    threadId = Dtq632QYJ2; 
 
}] 
 
child = <Argument: 0x608000333f60, objectId: 56AsB1juNP, localId: (null)> { 
 
    ACL = "<PFACL: 0x608000235540>"; 
 
    argumentText = "example "; 
 
    creatorId = hWRXoRvnYd; 
 
    level = 4; 
 
    parentId = j7GkpwUKsm; 
 
    reach = 0; 
 
    threadId = Dtq632QYJ2; 
 
} 
 
fatal error: unexpectedly found nil while unwrapping an Optional value


答えて

0

0x608000333f600x600000321a40値は、関連する変数のためのメモリアドレス位置です。アドレスの場所が異なるため、2つの子インスタンスが2つの別々の値として扱われ、おそらく一致しないと考えられます。そして、それはあなたが走っている問題かもしれません。

親インスタンスの親インスタンスを一意のID値でチェックして、親インスタンスの子インスタンスを正しく照合する方がよい場合があります。それは理にかなっていますか?

あなたは子供のためのインデックスにこの方法を見つけることができます。

var index = -1 
var found = false 
for chld in matrix[parent.objectId!]! { 
    index = index + 1 
    if chld.objectId == child.objectId { 
     found = true 
     break 
    } 
} 
if found { 
    // The index value at this point is the index for the child 
} 

あなたは、単にあなたのchild変数と同じOBJECTIDを持つ親配列内の子を見つけるために、子配列をフィルタリングして、見つけることができます子配列からインデックス、このような何か:返信用

let chld = matrix[parent.objectId!]!.filter{ $0.objectId == child.objectId }.first 
let indexOfChild = matrix[parent.objectId!]!.index(of: chld) 
+0

感謝しかし、私は非常にあなたがユニークなIDによって何を意味するのか取得できませんでした..私は自動的に私が作成するたびに与えられているにObjectIdを(考えています新しいインスタンス)は、t彼はインスタンスの残りの部分。私が間違っている?私がバックエンドからオブジェクトを照会するときに単にメモリアドレスの場所をフィルターにかける方法はありませんか? –

+0

はい、objectIdを一意のIDとして使用できます。あなたは、上記の答えに追加するコードセグメントのようなものを使って、一致するobjectIDを持つ子を見つけることができます。 – Fahim

+0

ありがとうございます。私は一日中このことを考え出し、ついにあなたに感謝してくれました:) –

関連する問題