Swift 中的多个初始化器

Posted

技术标签:

【中文标题】Swift 中的多个初始化器【英文标题】:multiple initializers in Swift 【发布时间】:2018-07-03 18:18:37 【问题描述】:
Error: play.playground:34:5: error: invalid redeclaration of 'init'

如何在 Swift 中为一个类设置多个初始化器?我认为如果我为每个 init 提供不同的参数,那么每个 init 都会有不同的方法签名,我可以创建多个。为什么这不起作用,或者我在其他地方犯了错误? (下面是从操场上拉出来的。)

//make a class
class Human
    var name: String
    var age: Int
    init(_ name: String)
        self.name = name
        self.age = -1
     
    init(name: String, age: Int)
        self.name = name
        self.age = age

    


var newHuman = Human("bob")
print(newHuman.name)

var newHuman2 = Human(name: "Marmelade", age: 19)
print(newHuman2)

【问题讨论】:

您的代码在复制并粘贴到 Xcode 9.4 Swift 游乐场时可以正常工作。 请注意,这样做的一种有趣方法是,将init(name: String, age: Int = -1) 传递给相同的方法并避免冗余。不过,这并没有回答你的问题。请参阅docs.swift.org/swift-book/LanguageGuide/Functions.html中的“默认参数值”部分 酷,我不知道交易是什么——我只是做了同样的事情。谢谢! @Larme 是的,好点,会做的! @MariaTeleki 不要使用 -1。将属性设为可选并将其设置为 nil。 【参考方案1】:

您可以传递更多具有默认值的参数,例如 gender: String = ""

init(name: String, age: Int = 0, gender: String = "")
    self.name = name
    self.age = age



var newHuman = Human("bob")
print(newHuman.name)

var newHuman2 = Human(name: "lol", age: 0)
print(newHuman2)

var newHuman3 = Human(name: "lol", age: 3, gender: "Male")
print(newHuman2)

【讨论】:

这如何回答这个问题?【参考方案2】:

你试过convenience关键字吗?

//make a class
class Human
    var name: String
    var age: Int
    convenience init(_ name: String)
        self.init(name: name, age: -1)
    
    init(name: String, age: Int)
        self.name = name
        self.age = age

    


var newHuman = Human("bob")
print(newHuman.name)

var newHuman2 = Human(name: "Marmelade", age: 19)
print(newHuman2)

【讨论】:

【参考方案3】:
class Your_ViewController : UIViewController 

    var yourFirstProperty : String?
    var yourSecondProperty : String?

    init(yourFirstProperty: String) 
        self.yourFirstProperty = yourFirstProperty
        self.yourSecondProperty = nil
        super.init(nibName: nil, bundle: nil)
    

    init(yourSecondProperty: String) 
        self.yourSecondProperty = yourSecondProperty
        self.yourFirstProperty = nil
        super.init(nibName: nil, bundle: nil)
    

    override func viewDidLoad() 
        super.viewDidLoad()

    

    required init?(coder: NSCoder) 
        fatalError("init(coder:) is not supported")
    

您可以在这里轻松地为您的视图控制器设置多个初始化程序我已经编写了一个可以通过两种方式初始化的视图控制器

这适用于使用纯代码制作 UI 的程序员

【讨论】:

以上是关于Swift 中的多个初始化器的主要内容,如果未能解决你的问题,请参考以下文章

Xcode 9.3(Swift 4.1)中的 Codable '没有初始化器'

为啥结构在 Swift 中没有像类一样的反初始化器?

Swift中的多个初始值设定项

结构中的 Swift/SwiftUI 属性初始化程序错误

Swift 对默认初始化器的访问控制

6.Swift协议|扩展|访问权限|异常调试|类型转换|运算函数|ARC|类类型初试化器|值类型初始化器