2017-10-05 2 views
0

Ich möchte ein Wörterbuch mit NSMutableArray<Client> Werte deklarieren. Aber die Sache ist, dass ich einen Fehler bekomme, der darauf hinweist, dass ich den <Client> Teil entferne.Swift 3 - Wie deklariere ich ein getipptes NSMutableArray

var mydict: [String:NSMutableArray<Client>] = [:] 

Wie ist der richtige Weg für declare a getippt NSMutableArray

+7

einen besonderen Grund Ihnen klar ist, warum Sie Foundation (NSStuff, wie NSMutableArray) in Swift 3 und nicht verwenden Swift Array, wie 'var myDict behalten wollen: [ String: [Kunde]] '? – Larme

+0

@ricardo: Wenn alles, was Sie zu erreichen versuchen, ist durch Verweis übergeben und übergeben Sie nicht Wert mit NSMutableArray, dann konvertieren Client in Klasse und nicht Struct und Swift Array verwenden, die durch Verweis übergeben werden nicht übergeben von Wert –

+0

@Ricardo : Array in swift ist als Struct implementiert. Wenn Sie also ein Array von Klassenobjekten erstellen, wird das Array als Wert übergeben übergeben, was bedeutet, dass alle Operationen auf dem Array wie Objekt entfernen/Objekt einfügen nicht zum übergebenen Array zurückreflektiert werden, sondern Klassenobjekte im Array als Referenz übergeben werden Die Eigenschaft eines Objekts in einem Array bleibt erhalten und wird auch in einem übergebenen Array-Objekt reflektiert. –

Antwort

0
var myDict = [String : [Client]]() 
+0

Dies ist kein NSMutableArray, Strukturen werden von Kopie übergeben. – Ricardo

1

NSMutableArray einen heterogenen Behälter

+1

Ich denke, in obj-c gibt es eine Möglichkeit, einen Typ dieses Containers wie NSMutableArray Ricardo

0

ist können Sie auch var mydict: [String:[Client]] = [:]

wie diese schreiben können Sie mögen tun dies

import UIKit 
import PlaygroundSupport 

    struct Client 
    { 

    } 
    class MyViewController : UIViewController { 

     var mydict: [String:[Client]] = [:] 

     override func loadView() { 
      let client = Client() 
      mydict["xyz"] = [client] 
      print(mydict) 
     } 
    } 
+0

Nein, [Client] ist eine Struktur !! kein Objekt! – Ricardo

+0

Sie liegen falsch. Lesen Sie diese https://stackoverflow.com/a/24251066/2139691 – Ricardo

1

Eine schnelle Expansion auf Vishal Patel ‚s Antwort:

Wenn Sie diese in ein Storyboard einfügen wird es auf keine Client-Typen versagen

import UIKit 
import PlaygroundSupport 

struct Client 
{ 

} 

struct NoneClient 
{ 

} 

class MyViewController : UIViewController { 

    var mydict: [String:[Client]] = [:] 

    override func loadView() { 
     let client = Client() 
     mydict["xyz"] = [client] 

     let noneClient = NoneClient() 

     mydict["abc"] = [NoneClient] 
    } 
} 
0

Sie sollten nicht NSMutableArray nicht mehr verwenden, jedoch Sie können nicht für Client mit NSMutableArray Entweder Pass von ref erreichen, wenn es struct ist

Bitte verwenden Sie wie unten

var myDict = [String : [Client]]() 

Wenn Sie mit dem Schiedsrichter übergeben wollen, dann sollte Client sein eine Klasse in Ihrer Implementierung nicht struct.

Wenn Sie mit struct nur gehen wollen, dann müssen Sie manuell aktualisiert Klient `neu zuweisen zurück

bei Klasse (Better Option)

(myDict["key1"] as! [Client]).firstName = "Jon" 

bei Struct Zum Wörterbuch

var clientObjArray = (myDict["key1"] as! [Client]) 
    var clientObjArrayFirstObj = clientObjArray.first 
    clientObjArrayFirstObj?.name = "Jon" 
    clientObjArray.remove(at: 0) 
    clientObjArray.insert(clientObjArrayFirstObj!, at: 0) 
    myDict["key1"] = clientObjArray 

Hinweis: Zum Beispiel habe ich hav e hinzugefügt erste und 0 Index statische

Hoffe, es

Verwandte Themen