class Fruit{
var name:String
var price: Double
var color:String
init(name:String,price:Double,color:String) {
self.name = name
self.price = price
self.color = color
}
}
然后
override func viewDidLoad() {
super.viewDidLoad()
let fruit = Fruit(name: "Apple",price: 0.99,color: "Yellow")
print(fruit.color)// Prints Yellow
fruit.color = "RED"
print(fruit.color) //Prints RED
}
,
当前代码如下。
protocol Food {
var name : String {set get}
var price : Double {set get}
}
struct Fruit : Food {
var name : String
var price : Double
var color : String
}
class Fridge {
var food : Fruit
init(food : Fruit) {
self.food = food
}
}
class Container {
var food : Fruit
init(food : Fruit) {
self.food = food
}
}
var container = Container.init(food: Fruit(name: "Apple",color: "Yellow"))
var fridge = Fridge.init(food:container.food)
var fruit = fridge.food as! Fruit
fruit.color = "Red"
print(fruit.color) // "Red"
var fruit1 = fridge.food as! Fruit
print(fruit1.color) // "Yellow"
因为Fruit是结构类型,而struct是值类型,而不是引用类型
var fruit = fridge.food as! Fruit // it will create a new reference instead of modified the created one.
fruit.color = "Red"
print(fruit.color) //"Red"
解决方案:
var fridge = Fridge.init(food: container.food)
fridge.food.color = "Red"
print(fridge.food.color) // "Red"
,
您始终必须强制转换为as ?,否则在其他类型的情况下会崩溃。
这是正确的方法:
protocol Food {
var name : String {set get}
var price : Double {set get}
}
struct Fruit : Food {
var name : String
var price : Double
var color : String
}
class Fridge {
var food : Food
init(food : Fruit) {
self.food = food
}
}
var fridge = Fridge.init(food: Fruit(name: "Apple",color: "Yellow"))
print(fridge.food.name) // "Apple"
if let food = fridge.food as? Fruit {
print(food.color) // "Yellow"
}
if var fruit = fridge.food as? Fruit {
fruit.color = "Red"
fridge.food = fruit
}
if let food = fridge.food as? Fruit {
print(food.color) // "Red"
}
本文链接:https://www.f2er.com/3136705.html