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

时间:2014-08-04 05:08:08

标签: swift

class MyString: String {}

给出错误:

  

继承自非协议,非类型'字符串'`。

看起来String不是一个类。但是为什么它可以在预期AnyObject的情况下使用?我虽然AnyObject仅用于类类型,而Any可以是类或非类类型。

1 个答案:

答案 0 :(得分:21)

如果您命令+点击Xcode中的String

struct String {
    init()
}

所以Stringstruct

您不能从struct继承,因为错误消息表示:

  

错误:从非协议,非类类型'字符串'

继承

但是,只有直接或间接导入NSString时,您才能隐式将其转换为AnyObjectFoundation的子类型。

来自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
                         ^

  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>  

但是除非你绝对必须,否则尽量避免继承StringNSString。您可以在NSString Subclassing Notes了解更多信息。

使用扩展程序向String

添加新方法
extension String {
    func print() {
        println(self);
    }
}

"test".print()

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

struct MyString {
    let str : String = ""

    func print() {
        println(str)
    }
}