考虑一个协议和一个实现它的类:
protocol MyProtocol {
var x: Int { get }
}
class MyClass : MyProtocol {
var x: Int = 5
}
Run Code Online (Sandbox Code Playgroud)
我有一个类型的数组,[MyClass]
我希望将它分配给一个类型的变量[MyProtocol]
.但是,这在Playground(XCode 6.3,Swift 1.2)中尝试时会导致错误:
var classArr: [MyClass] = [MyClass(), MyClass()]
var protocolArrA: [MyProtocol] = classArr // Causes error: EXC_BAD_INSTRUCTION
var protocolArrB: [MyProtocol] = classArr as [MyProtocol] // Causes error: EXC_BAD_INSTRUCTION
var protocolArrC: [MyProtocol] = [MyProtocol](classArr) // Causes error: Cannot find an initializer for type [MyProtocol[ that accepts an argument list of type [MyClass]
Run Code Online (Sandbox Code Playgroud)
在Swift中进行此分配的正确方法是什么?
PS有趣的是,当使用基类而不是协议时,表达式 …
Swift没有抽象的类和方法.相反,它提供协议.
当你的课程完全抽象或完全具体时,这很好.
但是,实现具有具体方法的抽象类的最佳'Swift'方法是什么?
伪代码示例:
class Animal {
abstract makeSound()
abstract eyeCount()
}
class Mammal : Animal {
override eyeCount { return 2 } // Let's assume all mammals have hard-coded 2 eyes...
class Cat : Mammal {
override makeSound { print "Meow!" }
}
class Dog : Mammal {
override makeSound { print "Woof!" }
}
Run Code Online (Sandbox Code Playgroud)
在哺乳动物中,我确实想要实施具体的方法,eyeCount()
因为所有哺乳动物都有2个硬编码的眼睛(据说是),我不想在狗和猫中重新实施它.然而,makeSound()
只应该为狗和猫实施,因为哺乳动物有不同的声音.
你会如何在Swift中实现它?谢谢!
免责声明:我在SO上阅读了类似的问题,找不到我的问题的解决方案.
我想将一个SKScene的子类添加到以前没有使用过SpriteKit的项目中.
该项目是ObjC和Swift的混合体.子类是用Swift编写的.
我做了什么:
这是新课程:
import SpriteKit
class SnowScene: SKScene {
}
Run Code Online (Sandbox Code Playgroud)
请注意,该类不是代码中任何其他位置的引用.
当我编译我的应用程序时,我在标题中收到错误.错误发生在我的-Swift.h文件中,该文件自动导出新类(我不知道为什么).
SWIFT_CLASS("_TtC11MyCoolApp9SnowScene")
@interface SnowScene : SKScene
@end
Run Code Online (Sandbox Code Playgroud)
有谁知道我做错了什么以及如何规避这个问题?