在阅读有关可选协议要求的Apple文档后,它表示您可以使用可选链接来检查实现.我尝试了这个,我一直收到错误.看起来这不再是这样做的有效方式,我试图找出现在是否有新的方法来做到这一点.
这是一个例子,你可以看到错误:http ://swiftstub.com/743693493/
这是我的代码:
@objc protocol Bearable {
func growl()
optional func cough() -> String //Apparently bears cough when they are scared.
}
@objc class Bear:Bearable {
var name = "Black Bear"
func growl() {
println("Growllll!!!")
}
}
@objc class Forest {
var bear:Bear?
func scareBears() {
if let cough = bear?.cough?() {
println(cough)
} else {
println("bear was scared")
}
}
}
Run Code Online (Sandbox Code Playgroud)
我收到错误: error: 'Bear' does not have a member named 'cough'
if let cough = bear?.cough?() …
这是我如何返回表视图的行数:
public func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if let dataCount = self.data?.count {
return dataCount
} else {
return 0
}
}
Run Code Online (Sandbox Code Playgroud)
但是,我想使用可选链接使其更简洁......但编译器对我的代码不满意.我试试这个:
return self.data?.count
Run Code Online (Sandbox Code Playgroud)
并且它抱怨计数是Int类型?我应该强行打开它,所以我这样做:
return self.data?.count!
Run Code Online (Sandbox Code Playgroud)
并且它抱怨count是Int类型.使用可选链接,如果数据不是nil,它应该只得到计数,如果数组不是nil,那么我知道count将返回ok.
我错过了什么?谢谢
在https://code.google.com/p/guava-libraries/wiki/UsingAndAvoidingNullExplained上,解释了guava(以及后来的java 8)添加了一个通用类Optional以清除空检查.
如果函数返回Optional,则需要调用者在使用之前解包该字符串.
这通常是在表格中完成的
Optional<String> possible = returnAnAbsentOptional();
if(possible.isPresent()){
System.out.println(possible.get())
}
Run Code Online (Sandbox Code Playgroud)
如果returnAnAbsentOptional返回null,我们又重新开始NPE.
我的问题是,为什么Guava/Java使用possible.isPresent()而不是Optional.isPresent(可能),它可以相应地对null值做出反应?
我有这个函数接受Double值,将其转换为货币格式并返回格式为R $的字符串:1.200,30.
func convert_Value(valor: Double) ->String {
let formatter = NSNumberFormatter()
formatter.numberStyle = NSNumberFormatterStyle.CurrencyStyle
formatter.locale = NSLocale(localeIdentifier: "pt_BR")
return ("\(formatter.stringFromNumber(valor))")
}
Run Code Online (Sandbox Code Playgroud)
此函数没有声明任何可选变量,但是当我使用以下方法调用它时:
x = convert_Value(1200.30)
Run Code Online (Sandbox Code Playgroud)
它返回:
Optional("R$1.200,30")
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚我需要做什么,因为它不是可选的我不能使用惊叹号打开可选项.我试图将函数中的Double和String参数转换为Optional,然后解包,但可选的stills显示.
有时,当我使用“ as”时,xcode提示失败并建议更改为“ as!”。此外,我还看到一些委托人是“ init?”。我知道某些变量可以被定义为可选变量。 ?
我用“快速编程语言”查询了问题,但没有找到答案。
我在一个ViewController中有一个结构,它有几个非可选成员,如:
struct MyStruct {
let id: Int64!
let name: String!
func checkValues() -> Bool {
if id == nil || name == nil {
return false
} else {
print("id: \(id) name: \(name)"); return true
}
}
}
Run Code Online (Sandbox Code Playgroud)
我在另一个VC(let temp = ViewController.MyStruct(id: 10, name: "Example"))中创建了一个struct实例,并将它传递给我通过Segue创建结构的那个.执行时,temp.checkValues()我得到
id: Optional(10) name: Optional("Example")
Run Code Online (Sandbox Code Playgroud)
从我对(非)选项的理解,我不应该得到Optional()自从我用变量声明!.我弄错了吗?现在我只要在使用它时就加上一个感叹号.我也试过init 在结构中使用,但没有改变任何东西.因为这不是预期的(如果我是对的)我担心我没有得到完整的概念......请告诉我我的代码/我有什么问题.
我正在尝试编写以下代码,其中C是子类B.并且getValue方法仅在C,而不是在B.但Eclipse在此声明中显示错误:
Optional.ofNullable(A).map(A::getB).map(C::getValue);
Run Code Online (Sandbox Code Playgroud)
如果是正常情况,我们将输入类似的转换和写入((C)a.getB()).getValue().我怎么写一个相同的Optional?
下面的代码打印:
should Not have called
hello world
Run Code Online (Sandbox Code Playgroud)
为什么orElse即使有包含值的Optional也要执行?
public static void main(String[] args){
String o = Optional.ofNullable("world").map(str -> "hello" + str).orElse(dontCallMe());
System.out.println(o);
}
private static String dontCallMe() {
System.out.println("should Not have called");
return "why god why";
}
Run Code Online (Sandbox Code Playgroud) 在类中定义可选属性时,Kotlin要求将其显式初始化为null,如下所示:
var myString: String? = null
Run Code Online (Sandbox Code Playgroud)
有没有理由说编译器无法推断出这个初始值?我相信Swift会让你跳过这= null部分,但这是Kotlin中的编译器错误.在编写以下内容后自动将值null设置为null会不会更简单?
var myString: String?
Run Code Online (Sandbox Code Playgroud) 有时,我们倾向于“过度使用”事物。这意味着我们拥有诸如Optional之类的东西,并且到处都可以看到用例。在Optional的情况下,一种常见的情况是将其方法链接起来以达到获得价值的单一目的。避免这种做法,而是依靠简单明了的代码。
这是真的Stream.ofNullable吗?我应该避免这种情况:
Stream.ofNullable(getHandlers(...))
.flatMap(Collections::stream)
.forEach(handler -> handler.handle(event));
Run Code Online (Sandbox Code Playgroud)
赞成吗?
List<Handler> handlers = getHandlers(...)
if (handlers == null) {
return; // do nothing
}
handlers.forEach(handler -> handler.handle(event));
Run Code Online (Sandbox Code Playgroud)