鉴于:
typealias Action = () -> ()
var action: Action = { }
func doStuff(stuff: String, completion: @escaping Action) {
print(stuff)
action = completion
completion()
}
func doStuffAgain() {
print("again")
action()
}
doStuff(stuff: "do stuff") {
print("swift 3!")
}
doStuffAgain()
Run Code Online (Sandbox Code Playgroud)
有没有办法制作类型的completion参数(和action)Action?并保持@escaping?
更改类型会出现以下错误:
error: @escaping attribute only applies to function types
删除@escaping属性,代码编译并运行,但似乎不正确,因为completion闭包正在逃避函数的范围.
这两种方法有什么区别:Optional.flatMap()和Optional.map()?
一个例子将不胜感激.
在Swift中处理选项的习惯用法似乎过于冗长,如果你想做的就是在nil的情况下提供一个默认值:
if let value = optionalValue {
// do something with 'value'
} else {
// do the same thing with your default value
}
Run Code Online (Sandbox Code Playgroud)
这涉及不必要地复制代码,或
var unwrappedValue
if let value = optionalValue {
unwrappedValue = value
} else {
unwrappedValue = defaultValue
}
Run Code Online (Sandbox Code Playgroud)
这unwrappedValue不一定是常数.
Scala的Option monad(与Swift的Optional基本相同)具有getOrElse用于此目的的方法:
val myValue = optionalValue.getOrElse(defaultValue)
Run Code Online (Sandbox Code Playgroud)
我错过了什么吗?斯威夫特有一个紧凑的方式吗?或者,如果失败,是否可以getOrElse在可选的扩展中定义?
我正在从字典中解开两个值,在使用它们之前我必须将它们转换为正确的类型.这就是我想出的:
var latitude : AnyObject! = imageDictionary["latitude"]
var longitude : AnyObject! = imageDictionary["longitude"]
if let latitudeDouble = latitude as? Double {
if let longitudeDouble = longitude as? Double {
// do stuff here
}
}
Run Code Online (Sandbox Code Playgroud)
但是如果让查询合二为一,我想打包两个.所以它会是这样的:
if let latitudeDouble = latitude as? Double, longitudeDouble = longitude as? Double {
// do stuff here
}
Run Code Online (Sandbox Code Playgroud)
那句法不起作用,所以我想知道是否有一种漂亮的方法可以做到这一点.
我一直在使用Java 8中的新Optional类型,我遇到了似乎是功能上不支持的常见操作:"orElseOptional"
考虑以下模式:
Optional<Result> resultFromServiceA = serviceA(args);
if (resultFromServiceA.isPresent) return result;
else {
Optional<Result> resultFromServiceB = serviceB(args);
if (resultFromServiceB.isPresent) return resultFromServiceB;
else return serviceC(args);
}
Run Code Online (Sandbox Code Playgroud)
这种模式有很多种形式,但归结为在一个可选项上需要一个"orElse",它接受一个生成一个新的可选项的函数,只有当前的一个不存在时才被调用.
它的实现看起来像这样:
public Optional<T> orElse(Supplier<Optional<? extends T>> otherSupplier) {
return value != null ? this : other.get();
}
Run Code Online (Sandbox Code Playgroud)
我很好奇是否有这样的方法不存在的原因,如果我只是以一种无意的方式使用Optional,以及人们提出了处理这种情况的其他方式.
我应该说,我认为涉及自定义实用程序类/方法的解决方案并不优雅,因为使用我的代码的人不一定知道它们存在.
另外,如果有人知道,这样的方法是否会包含在JDK 9中,我可以在哪里提出这样的方法?对我来说,这似乎是对API的一个相当明显的遗漏.
我正在使用Xcode 6 Beta 4.我有这种奇怪的情况,我无法弄清楚如何适当地测试选项.
如果我有一个可选的xyz,是正确的测试方法:
if (xyz) // Do something
Run Code Online (Sandbox Code Playgroud)
要么
if (xyz != nil) // Do something
Run Code Online (Sandbox Code Playgroud)
文档说这是第一种方式,但我发现有时,第二种方式是必需的,并且不会产生编译器错误,但有时,第二种方式会产生编译器错误.
我的具体示例是使用桥接到swift的GData XML解析器:
let xml = GDataXMLDocument(
XMLString: responseBody,
options: 0,
error: &xmlError);
if (xmlError != nil)
Run Code Online (Sandbox Code Playgroud)
在这里,如果我刚刚做了:
if xmlError
Run Code Online (Sandbox Code Playgroud)
它总会回归真实.但是,如果我这样做:
if (xmlError != nil)
Run Code Online (Sandbox Code Playgroud)
然后它工作(如在Objective-C中如何工作).
是否存在GData XML以及它对待我缺少的选项的方式?
有没有一种方法来检查字符串nil和""斯威夫特?在Rails中,我可以blank()用来检查.
我目前有这个,但它似乎有点矫枉过正:
if stringA? != nil {
if !stringA!.isEmpty {
...blah blah
}
}
Run Code Online (Sandbox Code Playgroud) 我一直在阅读关于Swift中的Optionals,我已经看过if let用于检查Optional是否包含值的示例,以及它是否存在 - 使用unwrapped值执行某些操作.
但是,我已经看到在Swift 2.0中,关键字guard主要用于.我想知道是否if let已从Swift 2.0中删除或是否仍然可以使用它.
我应该改变我的计划包含if let到guard?
我知道在Swift中所有变量都必须设置一个值,并且通过使用选项,我们可以设置一个nil最初设置的变量.
我不明白的是,用a设置一个变量!是做什么的,因为我认为这会从一个可选项中"解开"一个值.我想通过这样做,你保证有一个值来展开该变量,这就是为什么在IBActions上你会看到它被使用.
所以简单地说,当你做这样的事情时,初始化的变量是什么:
var aShape : CAShapeLayer!
Run Code Online (Sandbox Code Playgroud)
为什么/我什么时候会这样做?
Enum类是Serializable,因此使用枚举序列化对象没有问题.另一种情况是class具有java.util.Optional类的字段.在这种情况下,抛出以下异常:java.io.NotSerializableException:java.util.Optional
如何处理这些类,如何序列化它们?是否可以将此类对象发送到远程EJB或通过RMI?
这是一个例子:
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.Optional;
import org.junit.Test;
public class SerializationTest {
static class My implements Serializable {
private static final long serialVersionUID = 1L;
Optional<Integer> value = Optional.empty();
public void setValue(Integer i) {
this.i = Optional.of(i);
}
public Optional<Integer> getValue() {
return value;
}
}
//java.io.NotSerializableException is thrown
@Test
public void serialize() {
My my = new My();
byte[] bytes = toBytes(my);
}
public static <T extends Serializable> byte[] toBytes(T reportInfo) { …Run Code Online (Sandbox Code Playgroud)