Comment puis-je passer un dictionnaire comme paramètre d'une fonction?
Je suis en train de passer d'un dictionnaire comme un paramètre de la fonction. J'ai la fonction suivante
func makeAndAddVisitorRecord2(visitorDict: Dictionary) -> ABRecordRef <AnyObject, AnyObject> {
let visitorRecord: ABRecordRef = ABPersonCreate().takeRetainedValue()
ABRecordSetValue(visitorRecord, kABPersonFirstNameProperty, visitorDict[1], nil)
ABRecordSetValue(visitorRecord, kABPersonLastNameProperty, visitorDict[2], nil)
//ABRecordSetValue(visitorRecord, kABPersonEmailProperty, visitorDict[5], nil)
let phoneNumbers: ABMutableMultiValue =
ABMultiValueCreateMutable(ABPropertyType(kABMultiStringPropertyType)).takeRetainedValue()
ABMultiValueAddValueAndLabel(phoneNumbers, visitorDict["visitorPhone"], kABPersonPhoneMainLabel, nil)
ABRecordSetValue(visitorRecord, kABPersonPhoneProperty, phoneNumbers, nil)
ABAddressBookAddRecord(addressBookRef, visitorRecord, nil)
saveAddressBookChanges()
return visitorRecord
}
Laquelle je tiens à déclencher par
func addVisitorToContacts(sender: AnyObject) {
//let visitor = ListVisitors[visitorButton.tag]
var visitorDict:[Int:String] = [1:"\(visitorName)", 2:"\(visitorCompany)", 3:"\(visitorCity)",
4:"\(visitorPhone)", 5:"\(visitorEmail)"]
let visitorRecord: ABRecordRef = makeAndAddVisitorRecord2(visitorDict)
let contactAddedAlert = UIAlertController(title: "\(visitorName) was successfully added.",
message: nil, preferredStyle: .Alert)
contactAddedAlert.addAction(UIAlertAction(title: "OK", style: .Cancel, handler: nil))
presentViewController(contactAddedAlert, animated: true, completion: nil)
}
Mais makeAndAddVisitorRecord2 compile une erreur
Cannot specialize non-generic type 'ABRecordRef' (aka 'AnyObject')
[EDIT 1] solution viable mais pas optimale car je ne suis pas à l'aide de mon Visiteur struct
func makeAndAddVisitorRecord2(visitorDict: Dictionary <Int, String>) -> ABRecordRef {
[EDIT 2] @rsmoz remarquer que je devrais utiliser mon Visiteur struct
class Visitor {
var visitorName : String
var visitorCompany : String
var visitorPlace : String
var visitorPhone : String
var visitorEmail : String
init(visitorName: String, visitorCompany: String, visitorPlace: String, visitorPhone: String, visitorEmail: String) {
self.visitorName = visitorName
self.visitorCompany = visitorCompany
self.visitorPlace = visitorPlace
self.visitorPhone = visitorPhone
self.visitorEmail = visitorEmail
}
}
J'ai donc un ListVisitors classe qui génère quelques Visiteurs et ressemble
class ListVisitors{
static var sharedInstance = [Visitor]()
static func load()
{
//@todo: stored and loaded data
var visitor = Visitor(visitorName: "From Class Matt", visitorCompany: "Google", visitorPlace: "San Diego", visitorPhone: "94888484", visitorEmail: "[email protected]")
sharedInstance = [visitor]
visitor = Visitor(visitorName: "From Class John", visitorCompany: "nike", visitorPlace: "New York", visitorPhone: "94888484", visitorEmail: "[email protected]")
// ListVisitors.sharedInstance += [visitor]
sharedInstance += [visitor]
...
}
}
Et dans mon contrôleur principal, j'ai une vue de la table et d'une ligne sélectionnée envoie le visiteur détails à detailcontroller (COMMENT puis-je avoir sélectionné visiteur struct en vue de détail de contrôleur?? Dois-je laisser passer selectedVisitor à la vue de détail de contrôleur?)
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?){
if (segue.identifier == "visitorDetails") {
if let indexPath = tableView.indexPathForCell(sender as! UITableViewCell) {
let selectedVisitor = lVisitors[indexPath.row] as Visitor
let detailVC = segue.destinationViewController as! DetailViewController
detailVC.visitorName = selectedVisitor.visitorName
detailVC.visitorCompany = selectedVisitor.visitorCompany
detailVC.visitorPlace = selectedVisitor.visitorPlace
detailVC.visitorPhone = selectedVisitor.visitorPhone
detailVC.visitorEmail = selectedVisitor.visitorEmail
} //.end accessory select
} // .end segue
Pourquoi avez-vous besoin
Int:String
dictionnaire? Suffit d'utiliser un tableau.hmm, j'ai essayé
let visitorArr: Array = [String]() and visitorArr["visitorName"] = visitorName
et a essayé de passer le tableau en paramètre. Pourriez-vous fournir un exemple de code simple??? Pourquoi serait à l'aide d'un tableau > dictionnaire??
OriginalL'auteur alex | 2016-01-03
Vous devez vous connecter pour publier un commentaire.
Je ne suis pas sûr de ce que vous essayez de faire avec
ABRecordRef <AnyObject, AnyObject>
, mais le<>
la syntaxe pour spécifier un type générique. Tiens, un tableau qui contient les chaînes deArray<String>
.ABRecordRef
n'est pas un type générique.Le Dictionnaire doit avoir les types qu'il détient spécifié dans le paramètre:
Dictionary<String, Int>
Aussi, vous traiter un dictionnaire comme un tableau. Mieux vaut utiliser un dictionnaire comme il est destiné à être utilisé. Au lieu de
[1:"\(visitorName)"]
, pourquoi ne pas["visitorName":visitorName]
? De cette façon, vous pouvez y accéder commedict["visitorName"]
Vous n'avez pas besoin de faire"\(visitorName)"
si visitorName est une Chaîne pour commencer. Suffit d'utiliser la variable directement.Ce serait encore mieux, mais, pour représenter un Visiteur comme un struct, pas un tableau ou un dictionnaire:
Et vous pouvez l'installer comme ceci:
Et l'accès comme ceci:
Et c'est tellement plus propre et plus sûr. Maintenant, votre code ne sera pas toutes les erreurs d'accéder accidentellement à la mauvaise clé sur un dictionnaire.
Oh, et vous devriez être à l'aide de la Contacts cadre ces jours-ci, pas ABAddressBook.
Dictionary<Int:String>
ne fonctionne pas. C'estDictionary<Int, String>
. L'utilisation d'une virgule, pas un point-virgule.Merci pour cette remarque. Fixe.
je ralready avoir un Visiteur struct, que j'utilise. Mais dans detailviewcontroller je ne sais pas comment utiliser le Visiteur struct encore une fois, je viens de "cracher" les valeurs comme " ignorer func viewDidLoad() { super.viewDidLoad() lblName.texte = visitorName lblCompany.texte = visitorCompany ....` Donc, ce que j'ai fait, j'ai créé un "temp" dictonary qui détient les valeurs de Visiteur struct
Peut-être que si vous a montré plus de votre code, j'ai pu vous aider à mieux. Vous devriez toujours être en mesure d'utiliser la structure au sein de votre fichier.
j'ai édité ma question un peu. Espérons que vous me donner quelques conseils de plus. Je suis coincé avec l'aide de la droite "sélectionné"/passage au visiteur struct détail-vue-contrôleur BTW, je suis en train d'élaborer pour > iOS 8 et les Contacts de cadre > iOS 9 n'est-ce pas?
OriginalL'auteur rsmoz
Le type de dictionnaire dans Swift est appelé
Dictionary
. Cependant, il est générique, ce qui signifie que vous devez ajouter<>
après le nom du type de spécifier quel type de dictionnaire que vous voulez qu'il soit. Dans ce cas, il estDictionary<Int, String>
. C'est parce que la variable que vous êtes de passage à la méthode (visitorDict
) est de typeDictionary<Int, String>
.Écrire votre en-tête de fonction comme ceci:
Si vous voulez aller plus loin, vous pouvez utiliser le raccourci nom de type de dictionnaire:
Aussi, si vos clés pour le dictionnaire sont séquentiels, comme 1, 2, 3, 4 ,5, etc, vous pouvez utiliser un tableau à la place:
Et l'abréviation pour les tableaux est:
OriginalL'auteur Sweeper
Vous devez spécifier ce type de dictionnaire, il est rapide, comme suit:
Ensuite, vous pouvez utiliser
makeAndAddVisitorRecord2(visitorDict)
et tout devrait fonctionner.Vous types de collection apple doc a des exemples plus approfondis.
OriginalL'auteur Alex Pelletier
ABRecordRef n'est pas générique, vous ne pouvez donc pas l'utiliser comme vous l'avez fait. Le plus probable que vous souhaitiez ajouter la déclaration générale selon le Dictionnaire paramètre.
OriginalL'auteur Cristik