String类型是类还是结构?或者是其他东西?

Eth*_*han 14 swift

class MyString: String {}
Run Code Online (Sandbox Code Playgroud)

给出错误:

从非协议,非类型'String'继承.

所以看起来String不是一个阶级.但为什么它可以用于AnyObject预期的上下文?我虽然AnyObject只是类类型,但Any可以是类或非类类型.

Bry*_*hen 22

如果您String在Xcode中命令+单击

struct String {
    init()
}
Run Code Online (Sandbox Code Playgroud)

所以String是一个struct.

您不能从struct错误消息中说明子类:

错误:从非协议,非类型类型'String'继承

但是,只有直接或间接导入时,可以隐式将其转换为NSString(其子类型AnyObject).Foundation

来自REPL

  1> var str = "This is Swift String" 
str: String = "This is Swift String"
  2> var anyObj : AnyObject = str 
.../expr.oXbYls.swift:2:26: error: type 'String' does not conform to protocol 'AnyObject'
var anyObj : AnyObject = str
                         ^
Run Code Online (Sandbox Code Playgroud)
  1> import Foundation // <---- always imported in any useful application
  2> var str = "This is Swift String" 
str: String = "This is Swift String"
  3> var anyObj : AnyObject = str 
anyObj: _NSContiguousString = "This is Swift String" // it is not Swift string anymore
  4>  
Run Code Online (Sandbox Code Playgroud)

但是尽量避免使用子类StringNSString除非你绝对必须.您可以在NSString Subclassing Notes中阅读更多内容.

使用扩展名添加新方法 String

extension String {
    func print() {
        println(self);
    }
}

"test".print()
Run Code Online (Sandbox Code Playgroud)

如果您想要对其进行更多控制,请使用委托模式

struct MyString {
    let str : String = ""

    func print() {
        println(str)
    }
}
Run Code Online (Sandbox Code Playgroud)