我想答案是“不要那样做”,但这里。。。考虑:

class Enemy {
   var name: String
   var type: Int
   init(ofType: Int) {
       type=ofType
   }
}

我有两种类型的敌人,friends=0和closeFriends=1。一个人的敌人随时可能在这两者之间切换。所以:
var newEnemy = Enemy(ofType:.closeFriend)
newEnemy.name = "Bob"

也许在未来的某个时候:
newEnemy.type = .friend

但我发现这个语法有点晦涩难懂。出于同样的原因,最好使用enum而不是Int,如果您创建了直接表示其类型的新对象,那么您的意图将更加明确,可能:
var newEnemy = CloseFriend(withName:"Bob")

通常这需要子类化Friend和CloseFriend,但是不能简单地将Friend变成CloseFriend。
typealias似乎这是一个解决方案,我可以把敌人化名为朋友和密友。但这并没有添加新的init,该init基于别名设置type。例如,CloseFriend()应该将类型设置为1,而不必指定它。有办法吗?

最佳答案

使用函数很简单,但我建议不要这样做:

class Enemy {
    enum EnemyType: Int {
        case friend
        case closeFriend
    }

    var name: String
    var type: EnemyType

    init(type: EnemyType, name: String = "") {
        self.type = type
        self.name = name
    }
}

// let's make a function that looks like creating new object
func CloseFriend(name: String) -> Enemy {
    return Enemy(type: .closeFriend, name: name)
}

这些“聪明”的东西完全破坏了代码的可读性。没有什么比写作更具可读性了:
Enemy(type: .closeFriend, name: "Bob")

没有理由保存一些代码字母。
当然,您可以创建一个工厂函数
extension Enemy {
    static func closeFriend(name: String) -> Enemy {
        return Enemy(type: .closeFriend, name: name)
    }
}

但是,打电话给:
Enemy.closeFriend(name: "Bob")


Enemy(type: .closeFriend, name: "Bob")

?

关于swift - Swift初始化器的名称与类不同?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55658680/

10-09 08:52