在我的Android应用程序中,我将用国际化来实现我的string。 所以,目前我遇到了一个语法问题和用不同语言编写的句子的问题。 例如: “5分钟前” – 英语 “vor 5 Minuten” – 德语 我可以在strings.xml中做如下的事情吗? <string name="timeFormat">{0} minutes ago</string> 然后有一些魔法 getString(R.id.timeFormat, dynamicTimeValue) 这种行为也可以解决不同的单词顺序的其他问题。
我正在创build一个应该有自己的run()实现的脚本的双向链接列表( MSScript run() ,并且在他们准备好时调用下一个脚本( rscript )。 我想创build的一个脚本只是一个延迟。 它看起来像这样: class DelayScript : MSScript { var delay = 0.0 override func run() { let delay = self.delay * Double(NSEC_PER_SEC) let time = dispatch_time(DISPATCH_TIME_NOW, Int64(delay)) let weakSelf = self dispatch_after(time, dispatch_get_main_queue()) { weakSelf.rscript?.run() Void.self } } init(delay: Double) { super.init() self.delay = delay } } rscript是下一个要运行的脚本。 问题是,如果我删除dispatch_after的最后一行,它不会编译,这是因为从可选链接run()更改返回types 。 […]
在Swift 2.2中,我经常使用类似于let x = UIView?()的简洁语法来声明variables。 这给了x UIView? 键入,并用nil初始化它。 (当然,在这些例子中,你可以使用任何types而不是UIView ) 但是,当我在Swift 3.0中做同样的事情时,我得到一个错误: Cannot invoke initializer for type 'UIView?' with no arguments Cannot invoke initializer for type 'UIView?' with no arguments 。 它还说, Overloads for 'UIView?' exist with these partially matching parameter lists: (Wrapped), (nilLiteral: ()) Overloads for 'UIView?' exist with these partially matching parameter lists: […]
我明白,在Swift中,所有的variables都必须设置一个值,通过使用可选项,我们可以设置一个variables来初始化nil 。 我不明白的是,用什么设置variables! 正在做,因为我的印象是,这从一个可选的“解开”一个值。 我认为这样做,你是保证有一个价值,打开这个variables,这就是为什么在IBActions和你看到它的使用。 所以简单地说,当你做这样的事情时,什么是被初始化的variables: var aShape : CAShapeLayer! 为什么/我什么时候可以这样做?
下面的代码工作正常 struct carConfi { var owner: String? let brand: String = "BMW" var currentMile: Double = 2000 } let tomCar = carConfi() 但是,如果将属性owner的types更改为常量,则初始化程序会出现错误 struct carConfi { let owner: String? // Change to constant let brand: String = "BMW" var currentMile: Double = 2000 } let tomCar = carConfi() //error: missing argument for parameter 'owner' in […]
可选项的全部原因是防止由于命中分配给nil / null / none的variables导致运行时崩溃。 因此,variables不能为零; 相反,它们可以被包装在一个可选types中,表示它们为Some或None,并解包以获得Some或者nil的特定内容。 但是如果你把它们全部解开包装! ,或隐式解包选项,你只是介绍的可能性,因为你是一个不完善的编码器,运行时崩溃。 如果你使用if let来安全地打开它们,你可以避免崩溃,但是你被困在if let语句的范围之内来处理Some里面的值,而你仍然必须处理潜在的nil情况。 如果你使用? 为了调用方法暂时解包,在完成时会被重新包装,引入多层分层可选包装的混乱可能性。 所以:在我看来,要做的事情是避免可选项(除非需要时)(例如调用返回它们的框架方法)。 但是,如果我不使用可选项,这意味着我的对象引用必须是非零,我不知道如何处理的情况下,出于某种原因,不应该是或不是,一个分配给对象引用的值。 我的问题是:我如何避免需要零? 这似乎需要一个不同的编程方法。 (或者我应该只使用可选项,如果这就是我正在做的事情,那么和简单地将对象引用赋值为空如何与其他语言一样好?) 我知道这可能是一个主观的问题,但我应该问这个问题呢? 我并没有试图挑起或激起辩论,我真的很想知道什么是正确的方法,因为我写了更多的Swift代码。
在观看关于LLDBdebugging器的苹果video的同时,我发现了一些我找不到的解释; 他在谈到可选的价值时写道: var optional: String? = nil; //This is ok, a common optional var twice_optional: String?? = nil; //What is this and why's this useful?? 我打开了一个操场,开始尝试,并意识到你可以写多达? 如你所愿,然后用相同数量的解包它们! 。 我理解包装/解包variables的概念,但不能想到我想包装一个值4,5或6次的情况。
我读过很多网站可选应该只用作返回types,而不是在方法参数中使用。 我正在努力寻找一个合乎逻辑的理由。 例如,我有一个有2个可选参数的逻辑。 因此,我认为这样写我的方法签名是有意义的(解决scheme1): public int calculateSomething(Optional<String> p1, Optional<BigDecimal> p2 { // my logic } 许多网页指定可选不应该被用作方法参数。 考虑到这一点,我可以使用下面的方法签名,并添加一个明确的Javadoc注释来指定参数可能为空,希望将来的维护人员将读取Javadoc,因此总是使用参数之前进行空检查(解决scheme2) : public int calculateSomething(String p1, BigDecimal p2) { // my logic } 或者,我可以用四种公共方法replace我的方法,以提供更好的接口,并使其更明显p1和p2是可选的(解决scheme3): public int calculateSomething() { calculateSomething(null, null); } public int calculateSomething(String p1) { calculateSomething(p1, null); } public int calculateSomething(BigDecimal p2) { calculateSomething(null, p2); } public int […]
很多时候,你需要编写如下的代码: if someOptional != nil { // do something with the unwrapped someOptional eg someFunction(someOptional!) } 这似乎有点冗长,也听说用! powershell解包运营商可能是不安全的,最好避免。 有没有更好的方法来处理这个问题?
我的Swift程序崩溃与EXC_BAD_INSTRUCTION和这个错误。 这是什么意思,我该如何解决? 致命错误:意外地发现零,而解包一个可选的值 这篇文章的目的是为了收集“意外发现无”问题的答案,所以它们不是零散的,很难find。 随意添加自己的答案或编辑现有的维基答案。