Swift:如何在'String'扩展中添加类方法

时间:2015-05-22 02:40:18

标签: swift

我想在扩展中添加一个类函数:

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)'

3 个答案:

答案 0 :(得分:9)

Classstatic函数不是在类/结构的实例上调用,而是在类/结构本身上调用,因此您不能只是将字符串附加到类。

Apple Documentation

  

在类型方法的主体内,隐式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)

"Within the body of a type method, the implicit self property refers to the type itself, rather than an instance of that type."

因此,当您通过添加类型方法扩展类型时,您只能通过self调用其他类型的方法。如果要调用实例方法,则需要创建实例并在其上调用方法。