由于Swift支持方法和初始化程序重载,因此您可以将多个init并排放在一起,并使用您认为方便的方法:
class Person {
var name:String
init(name: String) {
self.name = name
}
init() {
self.name = "John"
}
}
Run Code Online (Sandbox Code Playgroud)
那么convenience关键字为什么会存在呢?是什么让以下更好?
class Person {
var name:String
init(name: String) {
self.name = name
}
convenience init() {
self.init(name: "John")
}
}
Run Code Online (Sandbox Code Playgroud) 我在这个答案中看到用户指定了一个convenience required init().这到底是什么意思?
我知道该required关键字用于覆盖超类的指定初始值设定项,但convenience required声明的做法是什么?
我在ios 8 beta 4中创建了一个测试项目,它作为主视图控制器和第二个视图控制器创建为带有xib文件的UIViewController子类.
我在主控制器上放了一个按钮来显示第二个控制器:
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
@IBAction func testVCBtnTapped() {
let vc = TestVC()
presentViewController(vc, animated: true, completion: nil)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
Run Code Online (Sandbox Code Playgroud)
}
我运行应用程序并按下按钮显示第二个控制器 - 一切都很好
转到xcode beta 5,我运行应用程序,当我按下按钮时,屏幕变黑.
因为我知道他们搞砸了init代码,所以我尝试使用覆盖来查看它会修复它:
class TestVC: UIViewController {
override init() {
super.init()
}
required init(coder aDecoder: NSCoder!) {
super.init(coder: …Run Code Online (Sandbox Code Playgroud) 我有以下代码:
class Parent {
var foo: Int
init(someNum: Int) {
self.foo = someNum
}
}
class Child: Parent {
}
var parent = Parent(someNum: 999)
println(parent.foo) // prints "999"
var child = Child(someNum: 3872)
println(child.foo) // prints "3872"
Run Code Online (Sandbox Code Playgroud)
在Apple的2014 WWDC"Intermediate Swift"视频中,他说默认情况下不会继承初始值设定项,除非它的存储属性有默认值.但是foo,子类中没有默认值,Child但它明确地继承了该init(someNum:)方法.我理解错误的解释还是还有其他事情发生?
在最新的XCode 6 beta(5)中,我注意到我的应用程序中几乎每个类都抱怨错误:
Class does not implement its superclass's required members
例如:
import UIKit
let _sharedAPIManager = APIManager(baseURL: NSURL.URLWithString(API_URL))
class APIManager: AFHTTPSessionManager {
class var sharedInstance : APIManager {
return _sharedAPIManager
}
// this fixes compiler error but why it should be here?
required init(coder aDecoder: NSCoder!) {
super.init(coder: aDecoder)
}
override init() {
super.init()
}
override init(baseURL url: NSURL!) {
super.init(baseURL: url)
self.responseSerializer = AFJSONResponseSerializer()
self.requestSerializer = AFJSONRequestSerializer()
self.requestSerializer.setValue(API_KEY, forHTTPHeaderField: "X-Api-Key")
self.requestSerializer.setValue("3", forHTTPHeaderField: "X-Api-Version")
}
override init(baseURL url: NSURL!, …Run Code Online (Sandbox Code Playgroud) xcode 6 beta 5
错误:
类'ClassName'不实现其超类的必需成员
上
class ClassName:UIView
Run Code Online (Sandbox Code Playgroud)
也显示错误
上
init(frame: CGRect) {
super.init(frame: frame)
// Initialization code
self.backgroundColor = UIColor.clearColor()
}
Run Code Online (Sandbox Code Playgroud)
覆盖声明需要'ovveride'关键字
我在init之前放置了覆盖,删除了ovveride错误但是没有超类错误
提前致谢
我已经将自定义UIButton编码为:
class AccountOpeningButton: UIButton {
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
......
}
}
Run Code Online (Sandbox Code Playgroud)
我可以使用我的故事板成功实例化该类。现在,我做了一个UIView并想在我的UIView中添加此按钮为:
var customView:UIView = UIView()
customView.frame = CGRect(x: 0, y: 0, width: 350, height: 250)
.....
let fromDateBtn:UIButton = AccountOpeningButton()//Error comes here as : Missing Argument for parameter ‘coder’ in call
customView.addSubview(fromDateBtn)
Run Code Online (Sandbox Code Playgroud)
因此,也请帮助动态地重用此代码。
PS:我提到了http://napora.org/nscoder-and-swift-initialization/ 致命错误:对类 Class 使用未实现的初始化器“ init(coder :)” 无法实现其超类的必需成员 ,但未成功。
================================================== ==================== 尝试
let fromDateBtn:UIButton = UIButton() as! AccountOpeningButton
Run Code Online (Sandbox Code Playgroud)
这将引发CastException 无法将类型为'UIButton'的值转换为'.AccountOpeningButton'
我正在尝试实现Objective-C equiv.下面用nib调用视图控制器时.
目标C:
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
self.modalPresentationStyle = UIModalPresentationCustom;
self.transitioningDelegate = self;
}
return self;
}
Run Code Online (Sandbox Code Playgroud)
这是我到目前为止迅速的地方:
override init(nibName nibNameOrNil: String!, bundle nibBundleOrNil: NSBundle!) {
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
self.modalPresentationStyle = UIModalPresentationStyle.Custom
self.transitioningDelegate = self
}
Run Code Online (Sandbox Code Playgroud)
但是我一直收到这个错误:
Class "ViewController" does not implement its superclass's required members
Run Code Online (Sandbox Code Playgroud)
我以为上面的init方法是否需要成员?
编辑 - 进入下面的更多细节: 类不实现其超类的必需成员