首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Swift不能在类init方法中分配给self

Swift不能在类init方法中分配给self
EN

Stack Overflow用户
提问于 2014-10-18 13:30:03
回答 2查看 7.9K关注 0票数 4

我有一个叫Letter的类

代码语言:javascript
复制
class Letter
{    
    init() {}
}

这门课我有个分数线:

代码语言:javascript
复制
extension Letter
{
    convenience init(file_path:String) {
       self = Letter.loadFromFile(file_path)
    }

    class func loadFromFile(file_path:String)->Letter {...}
}

我需要创建并插入文件路径,当我调用Letter(file_path)时,我需要一个由func loadFromFile返回的新对象。如何分配init方法或返回新对象?

它给出了错误:

不能赋值:“自我”是不可变的

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-10-18 15:35:37

返回该类实例的类函数似乎是Swift中的反模式。您会注意到,像[NSString stringWithString:@"some other string"]这样的"with“Objective类方法将转换为”使用“-less方便初始化器:NSString(string: "some other string")

此外,您还需要在方便的初始化器中使用委托给指定的初始化器

此外,由于您定义了原始类,并且2)不需要与指定的初始化器不同范围的方便初始化器,所以我认为没有任何理由将其放在扩展中。

把它们放在一起:

代码语言:javascript
复制
class Letter {
    init() { … }

    convenience init(filePath: String) {
        self.init()
        loadFromFile(filePath)
    }

    func loadFromFile(filePath: String) { … }
}

let letter1 = Letter()
letter1.loadFromFile("path1")

let letter2 = Letter(filePath: "path2")

总之,在Swift中将赋值给self的类比是调用一个初始化器。

如果这对你有用,请告诉我!

票数 2
EN

Stack Overflow用户

发布于 2014-10-18 15:41:36

你不能分配给自己。像这样的东西呢?

代码语言:javascript
复制
class Letter {
}

extension Letter {
    convenience init(filePath: String) {
        self.init()
        // code to load a Letter from a file goes here.
    }

    class func loadFromFile(filePath: String) -> Letter {
        return Letter(filePath: filePath)
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26440263

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档