我有一个ViewController,它需要用ViewModel:NSObject初始化。我对ViewController的实现是:classViewController:UIViewController{letviewModel:ViewModelinit(withViewModelviewModel:ViewModel){self.viewModel=viewModelsuper.init(nibName:nil,bundle:nil)}requiredinit?(coderaDecoder:NSCoder){fatalError("init(coder:)hasnotbeenim
我注意到在Swift初始化器中初始化属性可以同时使用:self.property=1和property=1这两者有什么区别吗?如果不是,是否存在一种优胜劣汰的惯例? 最佳答案 在第一个中,您明确表示它是一个类/结构属性,而在第二个中它是隐式的。但是有一个很大的区别:如果有一个同名的局部变量(例如传递给init的参数),它将优先并隐藏类/结构属性。作为一个偏好问题,我总是更喜欢通过使用self使其显式化。此外,通过这样做,我可以避免在我认为我正在访问类属性时发生常见错误,而我正在使用局部变量或函数参数。
这是AppleSwift文档的副本:Assoonasallpropertiesofthesuperclasshaveaninitialvalue,itsmemoryisconsideredfullyinitialized,andPhase1iscomplete.Thesuperclass’sdesignatedinitializernowhasanopportunitytocustomizetheinstancefurther(althoughitdoesnothaveto).Oncethesuperclass’sdesignatedinitializerisfinished,thes
像UIView这样的一些特殊类有不止一个指定的初始化器。在Objective-X中,我们可以将公共(public)初始化分解为一个单独的函数-(id)initWithCoder:(NSCoder*)aDecoder{if(self=[superinitWithCoder:aDecoder]){[selfinitialize];}returnself;}-(id)initWithFrame:(CGRect)frame{if(self=[superinitWithFrame:frame]){[selfinitialize];}returnself;}在Swift中,这不再是可能的,因为以下
AppleSwift编程语言指南提到了init!初始化程序,但不提供任何示例。(搜索初始化!inthispage)我了解使用init?声明的普通可失败初始化程序,但我无法理解其他版本的需要。需要它做什么?有人可以举个例子吗? 最佳答案 这有两个目的:导入Swift不知道的CocoaAPI时。如果Swift不知道初始化器是否可以返回nil,它会用!这样开发人员就知道那里可能隐藏着一个nil,而无需强制开发人员在实际上没有理由的情况下测试nil。出于同样的原因,在其他上下文中使用了隐式解包选项(在某些情况下,您可能愿意牺牲编译时安全性来
我有一个关于Swift中的初始化的非常普遍的问题。与ObjectiveC不同,现在可以在函数外的声明中直接调用init():例如classViewController:UIViewController{letmyView:UIView=UIView()overridefuncviewDidLoad(){super.viewDidLoad()myView.frame=getFrame()myView.backgroundColor=UIColor.redColor()self.view.addSubview(myView)}funcgetFrame()->CGRect{returnCGR
我想像这样在初始化参数中使用Self:classA{publicinit(finishBlock:((_operation:Self)->Void)?=nil){...}}我知道我可以在这个地方使用“A”,但我想实现这一点,如果某个类继承自A,那么它的初始化器将知道操作,因为它是类类型,而不仅仅是A。例如,如果我写道:classB:A{publicinit(finishBlock:((_operation:Self)->Void)?=nil){...}publicfuncfooOnlyInB(){}}然后我可以使用:letb=B{(operation)inoperation.fooOn
我有一个在Objective-C中定义的类,其初始化程序是-initWithError:(由于依赖外部资源,初始化程序可能会失败)。我希望它在init()throws时桥接到Swift。继承自NSObject的常规初始化程序-init可以标记为不可用,因为我不想使用它。在Objective-C中,我有:@interfaceFoo:NSObject-(instancetype_Nullable)initWithError:(NSError**)error;@end当然,这在Objective-C中工作得很好。在Swift中,-initWithError被桥接为init(error:())
我有以下行:letjsonResults=NSData(contentsOfURL:Fetcher.URLforLicenseInfo())这编译和执行都很好,但是如果NSData的初始化失败,我稍后会在代码中得到一个异常。我试图添加另一行:ifjsonResults!=nil{///blah,blah...但随后编译器提示“无法使用参数列表类型'(NSData,NilLiteralConvertible)调用'!='”编译器不应该将NSData初始化程序返回类型识别为可选类型吗? 最佳答案 检查数据的长度:if(data.leng
我正在尝试在Swift中对UIColor使用getRed(green:blue:alpha:)函数。为此,我需要4个CGFloat变量(r、g、b、a)。目前,为此,我需要输入以下代码:varr:CGFloat=0varg:CGFloat=0varb:CGFloat=0vara:CGFloat=0有没有更简单的方法来写这个,可能更简洁? 最佳答案 是的,您可以使用元组来声明和初始化它们:var(a:CGFloat,r:CGFloat,g:CGFloat,b:CGFloat)=(0,0,0,0)