- Swift 4 Programming Cookbook
- Keith Moon
- 334字
- 2021-07-08 10:21:26
There's more...
Now that we have a PersonName struct, let's amend our Person class so that it can use it:
class Person {
let birthName: PersonName
var currentName: PersonName
var countryOfResidence: String
init(name: PersonName, countryOfResidence: String = "UK") {
birthName = name
currentName = name
self.countryOfResidence = countryOfResidence
}
var displayString: String {
return "\(currentName.fullName()) - Location: \(countryOfResidence)"
}
}
We've added the birthName and currentName properties of our new PersonName struct type, and we initiate them with the same value when the Person object is initiated. Since a person's birth name won't change, we define it as a constant, but their current name can change, so it's defined as a variable.
Now, let's create a new Person object:
var name = PersonName(givenName: "Alissa", middleName: "May", familyName: "Jones")
let alissa = Person(name: name)
print(alissa.currentName.fullName()) // Alissa May Jones
Since our PersonName struct has value semantics, we can use this to enforce the behavior that we expect our model to have. We would expect to not be able to change a person's birth name, and if you try, you will find that the compiler won't let you.
As we discussed earlier, changing the family name mutates the struct, and so a new copy is made. However, we defined birthName as a constant, which can't be changed, so the only way we would be able to change the family name would be to change our definition of birthName from let to var:
alissa.birthName.change(familyName: "Moon") // Does not compile. Compiler tells you to change let to var
When we change the currentName to have a new family name, which we can do, since we defined it as a var, it changes the currentName property, but not the birthName property, even though these were assigned from the same source:
print(alissa.birthName.fullName()) // Alissa May Jones
print(alissa.currentName.fullName()) // Alissa May Jones
alissa.currentName.change(familyName: "Moon")
print(alissa.birthName.fullName()) // Alissa May Jones
print(alissa.currentName.fullName()) // Alissa May Moon
We have used a combination of objects and structs to create a model that enforces our expected behavior.
- 現代C++編程:從入門到實踐
- UNIX編程藝術
- Mastering JavaScript Object-Oriented Programming
- Java程序設計與實踐教程(第2版)
- FFmpeg入門詳解:音視頻原理及應用
- Mastering Linux Network Administration
- Android玩家必備
- 大話Java:程序設計從入門到精通
- QGIS 2 Cookbook
- 深入實踐DDD:以DSL驅動復雜軟件開發
- 官方 Scratch 3.0 編程趣味卡:讓孩子們愛上編程(全彩)
- C語言程序設計
- Apache Solr for Indexing Data
- jMonkeyEngine 3.0 Beginner’s Guide
- 開源網絡地圖可視化:基于Leaflet的在線地圖開發