2017-12-20 9 views
0

私はこの質問をするためにスタックオーバーフロー時にアカウントを作成するまで、この回答のためにGoogleを検索しました。1つの変数、1つのクラスと2つの同じ関数swift

何らかの変数を持つクラスを保持するように変数をプログラミングし、同じ関数を2回呼び出す方法を教えてください。コード内で説明されています:

class Persons { 

var oldName = "" 
var oldAge = 0 
var oldGender = "" 
var name = "" 
var age = 0 
var gender = "" 

func create(_ name:String, _ age:Int, _ gender:String) -> String { 

    if(age > 100) { 
     print("Can't create a person with an age that is over 100!") 

     return "Not created!" 
    } 

    if(gender == "Boy" || gender == "Girl") { 

    } 
    else { 
     print("Gender has to be a girl or a boy!") 

     return "Not created!" 
    } 
    self.name = name 
    self.age = age 
    self.gender = gender 

    self.oldName = name 
    self.oldAge = age 
    self.oldGender = gender 

    print("You just created a \(gender) called: '\(name)' with the age of: '\(age)'!") 

    return "Created!" 
} 

func modify(_ targetName:String, _ newName:String, _ newAge:Int, _ newGender:String) -> String { 

    if(age > 100) { 
     print("Can't modify a person with an age that is over 100!") 
     return "Not modified!" 
    } 

    if(gender == "Boy" || gender == "Girl") { 

    } 
    else { 
     print("Gender has to be a girl or a boy!") 
     return "Not modified!" 
    } 

    if(targetName != "" && targetName == self.name) { 
     self.name = newName 
     self.age = newAge 
     self.gender = newGender 

     print("You just changed \(oldName)'s gender from: \(oldGender) to: \(gender), \(oldName)'s name from: \(oldName) to: \(name) and \(oldName)'s age from: \(oldAge) to: \(age)!") 
    } 
    else { 
     print("Please enter a valid target name or create one!") 
    } 

    return "Modified!" 
} 

func delete(_ targetName:String) -> String { 

    if(name != "" && targetName == self.name) { 
     print("Deleted: \(name)!") 
    } 
    else { 
     print("Please enter a valid target name or create one!") 
    } 

    return "Deleted!" 
} 

} 

var p = Persons() 
p.create("Isak", 11, "Boy") 
p.create("Sanne", 7, "Girl") // Here I create another person 
p.delete("Isak") // But if I say delete 'Isak' it does not delete him because I created 'Sanne' above! 

/* 
It would work like this 

p.create("Isak", 11, "Boy") 
p.delete("Isak") 
p.create("Sanne", 7, "Girl") 
*/ 

助けてください。私は答えを見つけるために年を費やしました。詳細が必要な場合は返信して、もう少し詳しく説明しようと思います。

+0

インスタンス化を理解できません!あなたはp = Person()によって人のインスタンスを1つだけ作成しました。次に、プロパティを変更するだけです。 –

答えて

2

ここでの問題は、Personの単一インスタンスで作業していることです。あなたがやっているとき:

p.create("Isak", 11, "Boy") 
p.create("Sanne", 7, "Girl") // Here I create another person 

をあなたがちょうどPersonクラスのpインスタンスのプロパティを編集しているにもかかわらず、他の人を作成していません。だから、Isakを削除するとき:

p.delete("Isak") 

すでにIsakが存在せず、彼はSanneに名前が変更されました。 SanneとISAK直前に削除しているとSanneはまだ既存およびアクセス可能です:あなたは二人を持っている。この状態では

var p1 = Persons() 
var p2 = Persons() 
p1.create("Isak", 11, "Boy") 
p2.create("Sanne", 7, "Girl") // Here I create another instance of person 
p1.delete("Isak") 

あなたは人の二つの別々のインスタンスを作成する必要があり、この問題を解決するには。

あなたの人々のすべてを保持するための単一のインスタンスを使用したい場合は、この使用します。ここでは、(あなたがあなたの質問ではなく、若干変更delete()方法で定義されたもの)Personクラスを持っている

class Person { 
var oldName = "" 
var oldAge = 0 
var oldGender = "" 
var name = "" 
var age = 0 
var gender = "" 

func create(_ name:String, _ age:Int, _ gender:String) -> String { 

    if(age > 100) { 
     print("Can't create a person with an age that is over 100!") 

     return "Not created!" 
    } 

    if(gender == "Boy" || gender == "Girl") { 

    } 
    else { 
     print("Gender has to be a girl or a boy!") 

     return "Not created!" 
    } 
    self.name = name 
    self.age = age 
    self.gender = gender 

    self.oldName = name 
    self.oldAge = age 
    self.oldGender = gender 

    print("You just created a \(gender) called: '\(name)' with the age of: '\(age)'!") 

    return "Created!" 
} 

func modify(_ targetName:String, _ newName:String, _ newAge:Int, _ newGender:String) -> String { 

    if(age > 100) { 
     print("Can't modify a person with an age that is over 100!") 
     return "Not modified!" 
    } 

    if(gender == "Boy" || gender == "Girl") { 

    } 
    else { 
     print("Gender has to be a girl or a boy!") 
     return "Not modified!" 
    } 

    if(targetName != "" && targetName == self.name) { 
     self.name = newName 
     self.age = newAge 
     self.gender = newGender 

     print("You just changed \(oldName)'s gender from: \(oldGender) to: \(gender), \(oldName)'s name from: \(oldName) to: \(name) and \(oldName)'s age from: \(oldAge) to: \(age)!") 
    } 
    else { 
     print("Please enter a valid target name or create one!") 
    } 

    return "Modified!" 
} 

func delete() -> String { 
    return "Deleted!" 
} 
} 

class Persons { 
var personsDictionary = [String: Person]() 
} 

var persons = Persons() 
var p1 = Person() 
var p2 = Person() 

p1.create("Isak", 11, "Boy") 
p2.create("Sanne", 7, "Girl") 

persons.personsDictionary[p1.name] = p1 
persons.personsDictionary[p2.name] = p2 

persons.personsDictionary["Isak"]?.delete() 

をし、 Dictionary[String : Person]の人物クラス。辞書の鍵はあなたの人の名前であり、価値はこの人です。

私たちは人のインスタンスを作成するときにpersonsDictionaryにそれを格納し、人の名前でその辞書のすべての人にアクセスすることができます。オプションが返され、定義されたすべてのメソッドを呼び出すことができます。

+0

ええ、しかし私は1人のクラス変数を持ちたいと思っています。私はなぜこの投稿を作ったのですか? – MopsiLikesFood

+0

@MopsiLikesFoodが編集しました。それをチェックしてください –

+0

それは私にエラーが表示されます: "タイプの値 'Persons'にはメンバー 'personsList'がありません – MopsiLikesFood

0

モデルオブジェクトをリポジトリとしても使用しようとしています。

シンプルなモデルの場合はシンプルなモデルが1つだけ必要ですが、シンプルなモデルの場合は構造体を使用する方が適しています。これはまた、あなたの自由

struct Person { 
    var name = "" 
    var age = 0 
    var gender = "" 
} 

注初期化子を提供します:より良い男女のための列挙型を使用するように...

enum Gender { 
    case male, female 
} 

struct Person { 
    var name = "" 
    var age = 0 
    var gender: Gender = .male 
} 

は、それからちょうどリスト

let simon = Person(name: "Simon", age: 20, gender: .male) 
let isak = Person(name: "Isak", age: 11, gender: .male) 

var people = [simon, isak] 

print(people.count) // output: 2 
people.remove(isak) 
print(people.count) // output: 1 

let sanne = Person(name: "Sanne", age: 7, gender: .female) 
people.append(sanne) 

に管理するために、配列を使用私はdocumentationインスタンシエーションを読み、配列はかなり基本的であることをお勧めします。最低限クラス、構造体、インスタンス化、配列について読む。

+0

ありがとう!しかし、simon.modifyのようなことをすることは可能ですか(変更は私が作った関数です)? – MopsiLikesFood

+0

@MopsiLikesFood、あなたがPersonの中で必要とする機能を定義し、必要なときに呼び出すことができます。 –

+0

私はノブだと申し訳ありませんが、どうすればいいですか?私はクラスの中でいくつかの機能を作ったが、どのようにそれらを呼び出すのだろうか? – MopsiLikesFood

0

ここで私はそれについてどうやって行くのか始まりです...

まず、すべて処理するためのクラス:私もさらに行くかもしれない

You just created a male called: 'Isak' with the age of: '11'! 
Result = Success 
You just created a female called: 'Sanne' with the age of: '7'! 
Sanne is female and age 7 
Isak is male and age 11 
Deleted: Isak! 
You just changed Sanne's gender from: female to: female, Sanne's name from: Sanne to: Sanne and Sanne's age from: 7 to: 7! 
New Sanne is female and age 8 
New Sanne is female and age 8 

let people = Person() 

// Create Isak. 
var result = people.create("Isak", 11, .male) 

// Here is how to detail with the results. 
switch result { 
case .success: 
    // Do something when successfully created. 
    print ("Result = Success") 
case .failed(let reason): 
    // Do something when failed to create. 
    print ("Result = \(reason)") 
} 

// Create Sanne 
result = people.create("Sanne", 7, .female) 

// Print the list to check they are in there. 
people.printList() 

// Delete Isak from the list. 
result = people.delete("Isak") 

// Change Sanne's name to New Sanne and age to 8. 
result = people.modify("Sanne", "New Sanne", 8, .female) 

// Print the list to check what's in there. 
people.printList() 

// Bonus showing how to get a persons full details. 
if let personData = people["New Sanne"] { 
    print ("\(personData.name) is \(personData.gender) and age \(personData.age)") 
} else { 
    print ("Not Found!") 
} 

結果は次のようになります。今ここに

class Person { 
    /// An enum for gender so that you can only ever use the permissable values. 
    public enum Gender { 
     case male 
     case female 
    } 

    /// An enum for the results so there are defined values to check (you could add more specific errors). 
    public enum Result { 
     case success 
     case failed(_: String) 
    } 

    /// A structure to hold the details of each person. 
    struct PersonData { 
     var name: String 
     var age: UInt 
     var gender: Gender 
    } 

    /// The internal list of people. 
    private var personList: [String: PersonData] = [:] 

    /// A function to create a person. 
    func create(_ name: String, _ age: UInt, _ gender: Gender) -> Result { 
     guard personList[name] == nil else { 
      print ("Person already created!") 

      return .failed("Person already created!") 
     } 

     guard age <= 100 else { 
      print("Can't create a person with an age that is over 100!") 

      return .failed("Cannot have age over 100!") 
     } 

     let person = PersonData(name: name, age: age, gender: gender) 
     personList[name] = person 

     print("You just created a \(gender) called: '\(name)' with the age of: '\(age)'!") 

     return .success 
    } 

    /// A function to modify a persons details in the list. 
    func modify(_ targetName: String, _ newName: String, _ newAge: UInt, _ newGender: Gender) -> Result { 
     guard let person = personList[targetName] else { 
      print ("Person not found in list!") 

      return .failed("Person not found!") 
     } 

     guard personList[newName] == nil else { 
      print ("Person already exists in list!") 

      return .failed("Person already exist in the list!") 
     } 

     if newAge > 100 { 
      print("Can't modify a person with an age that is over 100!") 

      return .failed("Cannot modify a person with an ager over 100!") 
     } 

     let oldName = person.name 
     let oldAge = person.age 
     let oldGender = person.gender 

     if targetName != newName { 
      personList.removeValue(forKey: targetName) 
     } 
     personList[newName] = PersonData(name: newName, age: newAge, gender: newGender) 

     print("You just changed \(oldName)'s gender from: \(oldGender) to: \(person.gender), \(oldName)'s name from: \(oldName) to: \(person.name) and \(oldName)'s age from: \(oldAge) to: \(person.age)!") 

     return .success 
    } 

    /// A function to delete a person from the list. 
    func delete(_ targetName:String) -> Result { 
     guard let _ = personList[targetName] else { 
      print ("Person not found in list!") 

      return .failed("Person not found in list!") 
     } 

     personList.removeValue(forKey: targetName) 

     print("Deleted: \(targetName)!") 

     return .success 
    } 

    /// A test function to print out the current list of people. 
    func printList() { 
     for (name, person) in personList { 
      print ("\(name) is \(person.gender) and age \(person.age)") 
     } 
    } 

    /// Bonus to allow you to get a persons full details using something like person[name]. 
    subscript(name: String) -> PersonData? { 
     return personList[name] 
    } 
} 

がどのようにあなたがそれを使用していますそれはあなたが始めるのに十分なはずです。

(これは何が起こっているのか説明してもらえますが、気軽に聞いてください)

関連する問題