Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios swift声明子类型的变量,引用超类型_Ios_Swift_Sprite Kit - Fatal编程技术网

Ios swift声明子类型的变量,引用超类型

Ios swift声明子类型的变量,引用超类型,ios,swift,sprite-kit,Ios,Swift,Sprite Kit,我试图在swift中使用多态性,但我做错了什么;我有以下情况: class Character : NSNode { let characterName = "name" } class World : NSNode { let character : NSNode = Character() // getting error here, NSNode does not have a property "characterName" character.characterName =

我试图在swift中使用多态性,但我做错了什么;我有以下情况:

class Character : NSNode {
 let characterName = "name"
}

class World : NSNode {
 let character : NSNode = Character()
 // getting error here, NSNode does not have a property "characterName"
 character.characterName = "new name" 
}
声明类型为Character()但引用类型为NSNode()的变量的正确方法是什么

Swift的这一特点并不罕见。您已经将
character
键入为NSNode,因此编译器只知道这一点。要告诉编译器它实际上是什么类型的对象(例如,NSNode的哪个子类),您可以向下转换


您的声明没有任何问题,只要您愿意在每次访问角色特性时放弃声明。但是你有什么理由不只是把
character
作为一个字符来输入吗?毕竟,Swift非常清楚这意味着它也是一个NSNode。在我看来,你对多态性的概念可能有点混乱。

但这不是稍微失去了多态性的意义吗?我已经习惯了Java,在那里你可以说“Fruit a=new Apple()”,编译器可以看到super和sub-classI的所有属性,但我不能回答这个问题;我从未使用过一种对多态性的含义有如此奇特想法的语言在Ruby中有“duck-typing”,意思是任何消息都可以发送到任何东西,你要抓住机会;但是斯威夫特的类型正好相反——它是超严格和确定的。也许先学习Java不是一个好主意:/-这是一件好事,在我看来,强类型语言更干净
(character as Character).characterName = "new name"