Ios 有没有一种方法可以创建一个我可以修改的自定义类?

Ios 有没有一种方法可以创建一个我可以修改的自定义类?,ios,swift,properties,Ios,Swift,Properties,目前,我已经创建了一个名为SongNames的自定义类。下面是它的代码: import Foundation class songAttributes { private var _songTitle: String! private var _songURL: String! var songTitle: String { return _songTitle } init(songTitle: String, songURL: String) { _songURL = s

目前,我已经创建了一个名为SongNames的自定义类。下面是它的代码:

import Foundation

class songAttributes {
private var _songTitle: String!
private var _songURL: String!

var songTitle: String {
    return _songTitle
}

init(songTitle: String, songURL: String) {
    _songURL = songURL
    _songTitle = songTitle

}
var songURL: String {
    return _songURL
}

}
我可以为这个类设置值。例如,我可能会写:

var songAttribute = songAttributes(songTitle: "That's What I Like", url: "some url")
但是,如果我试图更改刚刚创建的变量的属性,比如说:

songAttribute.songTitle = "Locked Out of Heaven"
我收到消息:“错误:songTitle是一个只能获取的属性”


也就是说,有没有办法搞乱我的SongName类,这样这些属性就可以更改,而不仅仅是获取?

如果您希望属性可以设置,那么就没有必要使用私有属性跳舞。此外,属性不应隐式展开,因为您正在初始化器中设置它们

import Foundation

class SongAttributes {
    var songTitle: String
    var songURL: String

    init(songTitle: String, songURL: String) {
        self.songURL = songURL
        self.songTitle = songTitle

    }
}

注意,按照惯例,类和结构名称应该以大写字母开头。

您正在做大量不必要的工作。您拥有支持所有公共变量的私有变量,并已将公共变量设置为计算属性。把这些都扔掉。这是不必要的复杂性:

import Foundation

class songAttributes {

    var songTitle: String 
    var songURL: String

    init(songTitle: String, songURL: String) {
        self.songURL = songURL
        self.songTitle = songTitle
    }
}
默认情况下,属性是读/写的,因此不需要做任何特殊的操作


前缀开头的私有支持变量的模式在很大程度上是Objective-C的延续,在Swift中很少需要

为什么要使用私有支持变量?只需公开string属性。此外,没有理由隐式地打开私有变量的选项。知道在您的示例中使用setter/getter是一种过分的技巧,我会使用
struct
over
class
,因为您正在操作数据。(struct-value-type,class-reference-type)这在复制(或多次复制)该数据时会产生很大的影响。在SWIFT中,使用getter/setter方法包装对私有实例变量的访问的Java风格是完全不必要的。实例变量不直接存在于Swift中。在您的示例中,您已经为
\u songtile
手动创建了一个getter,
\u songtile
,它本身就是隐藏实例变量的getter,请将其称为
\u songtile
。这是正确的方法。看起来您已经击败了我。还有几个人埋头研究如何制作定制的getter和setter,这是毫无意义的。我知道。某种奇怪的Objective-C或Java胡说八道。甚至Objective-C也在隐式setter/getter背后隐藏了IVAR数年。这是Objective-C的保留,即使在那里,它通常也是隐藏的。正如Paul指出的,你的类名应该以大写字母开头。