我想在扩展中添加一个类函数:
extension String {
class func test () {
}
}
我收到错误:Class methods are only allowed within classes; use 'static' to declare a static method
或者我该怎么称呼“String.test()
”
但 NSString
extension NSString {
class func aaa () {
}
}
没有错误。
如果我添加静态关键字:
extension String {
static func aaa () {
self.stringByAppendingString("Hello")
}
}
得到:Expression resolves to an unused function
,
那么我应该如何添加一个类函数,也想使用self.
方法。
编辑:这有效!
extension String {
static func aaa (path:String) -> String {
return path.stringByAppendingString("Hello")
}
}
但关于@ lan的回答:
mutating func bbb(path: String) {
self += "world"
}
当我输入时,它显示如下:
String.bbb(&<#String#>)
String.bbb(&"nihao")
Cannot invoke 'bbb' with an argument list of type '(String)'
答案 0 :(得分:9)
Class
和static
函数不是在类/结构的实例上调用,而是在类/结构本身上调用,因此您不能只是将字符串附加到类。
在类型方法的主体内,隐式self属性引用 类型本身,而不是该类型的实例。
但是,您可以使用String
关键字将字符串附加到mutating
的变量实例:
extension String {
mutating func aaa() {
self += "hello"
}
}
let foo = "a"
foo.aaa() // ERROR: Immutable value of type 'String' only has mutating members named 'aaa'
var bar = "b"
bar.aaa() // "bhello"
如果您尝试使用指向字符串的指针作为参数,则可以使用inout
关键字来更改输入的字符串:
extension String {
static func aaa(inout path: String) {
path += "Hello"
}
}
var foo = "someText"
String.aaa(&foo)
foo //someTextHello
答案 1 :(得分:1)
虽然正确,但是看到一个submitHandler = () => {
let { draw_number: draws, ...rest } = this.state;
let results = {
numbers: Object.keys(rest).map(key => rest[key])
draws,
};
console.log(results);
}
成员添加到mutating
扩展名中是非典型的,如Ian的答案所示。 String
(通常是值类型)是不可变的,因此使用String
方法的唯一方法是在调用站点处声明实例mutating
。在代码中,大多数时候您应该使用var
常量。
因此,扩展let
来返回新实例是更为常见的。所以这很典型:
struct
,然后在呼叫站点:
extension String {
func appending(_ string: String) -> String {
return self + string
}
}
您当然会注意到我根本没有使用let hello = "Hello, "
let helloWorld = hello.appending("World!")
。这是因为static
需要使用我们要附加的appending(_:)
的当前实例值,并且String
/ class
没有引用实例,因此没有值
答案 2 :(得分:0)
因此,当您通过添加类型方法扩展类型时,您只能通过self
调用其他类型的方法。如果要调用实例方法,则需要创建实例并在其上调用方法。