![](/img/trans.png)
[英]How to call a same variable in class by two difference class in Swift?
[英]One variable, one class and two of the same function swift
我已經在谷歌上搜索了這個答案很長時間,直到我在堆棧溢出時創建了一個帳戶來問這個問題。
您如何編程一個變量以保存其中包含某個變量的類,然后兩次調用同一函數? 代碼說明:
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")
*/
請幫忙。 我花了很長時間才找到答案。 如果您需要更多詳細信息,請回復,我將嘗試解釋更多內容。
這里的問題是您正在使用Person的單個實例。 在執行操作時:
p.create("Isak", 11, "Boy")
p.create("Sanne", 7, "Girl") // Here I create another person
盡管您只是在編輯Person
類的p
實例的屬性,但您並未創建其他人。 因此,當您刪除Isak時:
p.delete("Isak")
現在還沒有Isak,他已改名為Sanne。
要解決此問題,您應該創建兩個單獨的Person實例:
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")
在這種狀態下,您有兩個人:您剛剛刪除的Sanne和Isak,並且Sanne仍然存在並且可以訪問。
如果要使用單個實例來容納所有人員,請使用以下命令:
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()
在這里,我們有一個Person類(您在問題中定義的一個類,但具有稍微改變的delete()
方法)和Persons類,它們的字典為[String : Person]
。 詞典的關鍵是您這個人的名字,值是這個人。
當我們創建一個人員實例時,我們將其存儲在personsDictionary
然后我們可以通過人員名稱訪問該詞典中的每個人,並且將返回一個Optional,我們可以在該Optional上調用所有定義的方法。
您還試圖將模型對象用作存儲庫。
您只需要一個簡單的模型,對於一個簡單的模型,最好使用結構。 這也為您免費提供初始化程序
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)
我建議您通讀文檔實例化,並且數組是非常基本的。 至少閱讀有關類,結構,實例化和數組的信息。
這是我將如何做的開始...
首先,該類負責處理所有事情:
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]
}
}
現在,您可以使用它:
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!")
}
結果應為:
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
我也可能會更進一步,但這應該足以讓您入門。
(希望這些評論能夠說明發生了什么,但是如果不能隨意詢問的話)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.