【问题标题】:Swift optional chaining with non-nil value具有非零值的 Swift 可选链接
【发布时间】:2018-06-03 02:29:25
【问题描述】:

我有以下运行良好的程序 -

class Person {
    var pet: Pet?
}

class Pet {
    var name: String

    var favoriteToy: Toy?

    init(name: String) {
        self.name = name
    }
}

class Toy {
    var name: String

    init(name: String) {
        self.name = name
    }
}

let q = Person()
// Pet(name:"goofy")
// Toy(name:"teddy")

if let someToy = q.pet?.favoriteToy?.name {
    print("This person's pet likes \(someToy).")
} else {
    print("This person's pet does not have a favorite toy")
}

打印:

此人的宠物没有最喜欢的玩具

如何使用上面修改的代码打印“这个人的宠物喜欢泰迪”?

我知道我将无法使用if let,因为没有任何东西可以打开。所以我必须写这样的东西而不是if let

let someToy = q.pet.favoriteToy.name
print("This person's pet likes \(someToy).")

应该打印“这个人的宠物喜欢泰迪熊。”

我也知道我必须像这样输入非零值:

class Person {
    var pet = Pet ()
}

我仍然遇到初始化问题。该怎么办?

【问题讨论】:

  • 您的代码打印This person's pet does not have a favorite toy,因为q 没有宠物套装,所以它是nil。给它分配一个宠物。并分配每个玩具。

标签: swift


【解决方案1】:

这应该可以解决您的迫切需求...

let man = Person()
let goofy = Pet(name: "goofy")
let squeaky = Toy(name: "squeaky toy")

goofy.favoriteToy = squeaky
man.pet = goofy

但是,如果一个人通常要使用宠物和玩具进行初始化,并且这两个类都使用字符串进行初始化,那么您可能需要定义一个便捷初始化器:

class Pet {
  var name: String
  var favoriteToy: Toy?
  init(name: String) {
    self.name = name
  }
}

class Toy {
  var name: String
  init(name: String) {
    self.name = name
  }
}

class Person {
  var pet: Pet?
  convenience init(petName: String, toyName: String) {
    self.init()
    let toy = Toy(name: toyName)
    let pet = Pet(name: petName)
    pet.favoriteToy = toy
    self.pet = pet
  }
}

func test() {
  let bill = Person(petName: "goofy", toyName: "squeaky ball")
  guard let toyName = bill.pet?.favoriteToy?.name else { return }
  print(toyName)
}

test()

还有一件事:optional chaining 可以与 guard statement 结合使用,在 Swift 中效果非常好。

【讨论】:

  • 您的第一个答案(即时需要...)的工作方式如下:- let someToy = man.pet!.favoriteToy!.name print("This person's pet likes (someToy).") 打印 -这个人的宠物喜欢吱吱作响的玩具。虽然,我无法让您的第二个答案(便利初始化程序)起作用,但它显示错误。任何帮助将不胜感激。
  • 谢谢,Person init 中有一个错字。
  • 谢谢,但是在上述两种情况下如何使玩具名称为零?
【解决方案2】:

在初始化程序中使用? = nil 来传递一些可选参数。

class Person {
    var pet: Pet?

    init(pet: Pet? = nil) {
        self.pet = pet
    }
}

class Pet {
    var name: String

    var favoriteToy: Toy?

    init(name: String, toy: Toy? = nil) {
        self.name = name
        self.favoriteToy = toy
    }
}

class Toy {
    var name: String

    init(name: String) {
        self.name = name
    }
}

let q = Person(pet: Pet(name: "goofy", toy: Toy(name: "teddy")))
// Pet(name:"goofy")
// Toy(name:"teddy")

if let someToy = q.pet?.favoriteToy?.name {
    print("This person's pet likes \(someToy).")
} else {
    print("This person's pet does not have a favorite toy")
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-02
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 2015-05-27
    • 2018-09-21
    • 1970-01-01
    • 2023-03-24
    相关资源
    最近更新 更多