2015-05-22 15 views
6

Tôi muốn thêm một chức năng lớp thành phần mở rộng:Swift: Làm thế nào để thêm một phương pháp học trong 'String 'mở rộng

extension String { 
    class func test() { 
    } 
} 

tôi nhận được lỗi: Class methods are only allowed within classes; use 'static' to declare a static method

Hoặc làm thế nào tôi nên gọi là' String.test() "

Nhưng đối với NSString

extension NSString { 
    class func aaa() { 
    } 
} 

không có lỗi.

Nếu tôi thêm tĩnh keyword:

extension String { 
    static func aaa() { 
     self.stringByAppendingString("Hello") 
    } 
} 

Got: Expression resolves to an unused function,

Vì vậy, làm thế nào tôi nên thêm một chức năng lớp cũng muốn sử dụng phương pháp self..

EDIT: Công trình này!

extension String { 
    static func aaa (path:String) -> String { 
     return path.stringByAppendingString("Hello") 
    } 
} 

nhưng về @ lan của câu trả lời:

mutating func bbb(path: String) { 
    self += "world" 
} 

Khi tôi gõ nó xuất hiện như thế này:

String.bbb(&<#String#>) 
String.bbb(&"nihao") 

Cannot invoke 'bbb' with an argument list of type '(String)' 

Trả lời

6

Classstatic chức năng không được gọi vào một thể hiện của một lớp/struct , nhưng trên lớp/struct chính nó, vì vậy bạn không thể chỉ thêm một chuỗi vào một lớp.

Apple Documentation:

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

Bạn có thể, tuy nhiên, nối thêm một chuỗi vào một trường hợp biến của một String sử dụng mutating keyword:

extension String { 
    mutating func aaa() { 
     self += "hello" 
    } 
} 

let foo = "a" 
foo.aaa() // Immutable value of type 'String' only has mutating members named 'aaa' 

var bar = "b" 
bar.aaa() // "bhello" 

Nếu bạn đang cố gắng sử dụng một con trỏ đến một chuỗi dưới dạng thông số, bạn có thể sử dụng từ khóa inout để thay đổi chuỗi được nhập:

extension String { 
    static func aaa(inout path: String) { 
     path += "Hello" 
    } 
} 

var foo = "someText" 
String.aaa(&foo) 
foo //someTextHello 
+0

Tôi nên gọi "String.add()" như thế nào? –

+0

Trên một thể hiện của một String, không phải trên chính lớp đó. Nó làm cho hoàn toàn không có ý nghĩa gọi điện thoại thêm vào loại String vì không có giá trị để nối thêm vào – Ian

+0

hey @lan, bạn có thể kiểm tra câu hỏi của tôi edied một lần nữa? –

1

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

Vì vậy, khi bạn mở rộng loại bằng cách thêm phương thức nhập, bạn chỉ có thể gọi các phương thức loại khác thông qua self. Nếu bạn muốn gọi một phương thức cá thể, bạn cần tạo một cá thể và gọi một phương thức trên đó.

+0

Cảm ơn bạn, bạn cũng cho tôi gợi ý. –

Các vấn đề liên quan