我想答案是“不要那样做”,但这里。。。考虑:
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/