我有一些像这样的错误"表达式隐式强制来自'String?' 任何"这是我的代码:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
FIRApp.configure()
FIRAuth.auth()?.signIn(withEmail: "myemail@gmail.com", password: "mypassword", completion: { (user, error) in
if (error != nil) {
print(user?.email)
}else {
print(error?.localizedDescription)
}
})
return true
}
Run Code Online (Sandbox Code Playgroud)
这一行出错
print(user?.email)
Run Code Online (Sandbox Code Playgroud)
和
print(error?.localizedDescription)
Run Code Online (Sandbox Code Playgroud)
请帮我
访问UIapplication's主窗口时,它将作为a返回UIWindow??
let view = UIApplication.sharedApplication().delegate?.window // view:UIWindow??
Run Code Online (Sandbox Code Playgroud)
为什么它作为双重可选项返回,它是什么意思,如果放入一个if let应该添加一个!之后?
if let view = UIApplication.sharedApplication().delegate?.window!
Run Code Online (Sandbox Code Playgroud)
我的第一个问题是?用!后代表代替,但那不是解决方案.
someFunction(completion: { [weak self] in
self?.variable = self!.otherVariable
})
Run Code Online (Sandbox Code Playgroud)
这总是安全吗?我self在语句的开头访问了可选项,并且我个人认为如果self是,那么该语句的第二部分将永远不会被执行nil.这是真的?如果self确实如此nil,第二部分永远不会发生?self在这一行代码中,它永远不会被"填充"?
根据这篇文章,当在 TypeScript 中启用严格的空值检查时,除非联合明确允许,否则您不能分配null或分配undefined给变量。
// required value
let req: string;
req = "Something"; // OK
req = null; // Error
req = undefined; // Error
// nullable value
let nbl: string | null;
nbl = "Something"; // OK
nbl = null; // OK
nbl = undefined; // Error
Run Code Online (Sandbox Code Playgroud)
但是在 TypeScript 中null允许在可选值中使用吗?
// optional value
let opt?: string; // (actually invalid, as optional types cannot be used for variable declarations, but that's …Run Code Online (Sandbox Code Playgroud) 我有一个类Address看起来像这样:
@Value
class Address {
@NotNull String userId;
@NotNull String line1;
String line2;
private Address(Builder b) {
// copy everything from builder
}
// override getter for line2 so that it returns Optional<String>
public Optional<String> getLine2() {
return Optional.ofNullable(this.line2);
}
// and a Builder
public static class Builder {
// builder methods
}
}
Run Code Online (Sandbox Code Playgroud)
在这里我被迫写Builder了一个Getter因为,如果我想在使用Lombok时返回一个Optional,我必须声明line2为Optional<String>.这将生成一个接受的构建器方法Optional<String>!
还有其他方法可以使用lombok Optional吗?
Optional<ArrayList<String>> option = Optional.of(new ArrayList<>());
Optional<ArrayList<?>> doesntWork = option;
Optional<ArrayList<?>> works = option.map(list -> list);
Run Code Online (Sandbox Code Playgroud)
第一次尝试分配不会编译,而第二次则带有mapdo。感觉map应该没有实际完成任何事情,但是由于某种原因,这使我Optional<ArrayList<String>>变成了Optional<ArrayList<?>>。是否存在某种隐式强制转换?
在 C++17 中,如何使用可选元素声明和初始化成对(或元组)向量?
std::vector<std::pair<int, optional<bool> > > vec1 = { {1, true},
{2, false},
{3, nullptr}};
Run Code Online (Sandbox Code Playgroud)
我有一对,其中第二个元素可能为空/可选。
可选项的全部原因是为了防止因命中分配给nil/null/none的变量而导致的运行时崩溃.因此,变量不能为零; 相反,它们可以包含在一个Optional类型中,该类型将它们表示为Some或None,并解包以获取Some的具体内容,或者为nil.
但是如果你用它们!或者用Implicitly Unwrapped Optionals 打开它们,你只需要引入运行时崩溃的可能性,因为你是一个不完美的编码器.如果你使用它if let来安全地打开它们,你可以避免崩溃,但是你被困在if let语句的范围内以使用Some中的值,你仍然需要处理潜在的nil情况.如果使用?为了调用方法暂时解包,它将在完成后重新包装,引入多层次可选包装的混乱可能性.
所以:在我看来,要做的是避免选项,除非必要时(例如,当调用返回它们的框架方法时).但是,如果我不使用选项,那意味着我的对象引用必须是非零的,我无法弄清楚如何处理由于某种原因不应该存在或者不存在的情况,分配给对象引用的值.
我的问题是:我如何避免需要零?看起来它需要一种不同的编程方法.(或者我应该只使用选项,如果这就是我正在做的,那么除了像其他语言那样简单地对对象引用进行空分配外,它有什么用?)
我知道这可能是一个主观问题,但我还应该问其他问题呢?我不是想哄骗或激起辩论,我真的很想知道正确的方法是什么,因为我写了更多的Swift代码.
我一直在玩Swift并发现当向下投射一个要插入字典的对象时,我得到一个奇怪的警告:Treating a forced downcast to 'String' as optional will never produce 'nil'.如果我更换as,as?则警告消失.
func test() -> AnyObject! {
return "Hi!"
}
var dict = Dictionary<String,String>()
dict["test"]=test() as String
Run Code Online (Sandbox Code Playgroud)
Apple的文档说明如下
由于向下转换可能会失败,因此类型转换运算符有两种不同的形式.可选表单
as?将返回您尝试向下转换的类型的可选值.强制形式as尝试向下倾斜并强制将结果作为单个复合动作展开.
我不清楚为什么在这里使用as?而不是as正确的.一些测试显示,如果我更改test()以返回Int而不是String,如果我继续使用,代码将退出并出现错误as.如果我切换到使用as?那么代码将继续正常执行并跳过该语句(dict将保持为空).但是,我不确定为什么这是更可取的.在我看来,我宁愿程序退出并出现错误并让我知道演员表不成功然后只是忽略错误的声明并继续执行.
根据文档,我应该使用强制形式"只有当你确定转发将永远成功时".在这种情况下,我确信向下转换将永远成功,因为我知道test()只能返回一个字符串,所以我认为这是强制形式的向下转换的完美情况.那么为什么编译器会给我一个警告呢?
我Person在Swift中有一个简单的类,看起来像这样:
class Person {
var name = "John Doe"
var age = 18
var children = [Person]?
\\ init function goes here, but does not initialize children array
}
Run Code Online (Sandbox Code Playgroud)
children我可以简单地声明它并将其初始化为一个空数组,而不是声明为可选数组:
var children = [Person]()
Run Code Online (Sandbox Code Playgroud)
我想确定哪种方法更好.将数组声明为可选数组意味着它根本不会占用任何内存,而空数组至少为它分配了一些内存,对吗?因此,使用可选数组意味着至少会节省一些内存.我想我的第一个问题是:这里是否真的存在实际的内存节省,或者我对这个错误的假设是什么?
另一方面,如果它是可选的,那么每次我尝试使用它时,我都必须nil在添加或删除对象之前检查它是否存在.因此那里会有一些效率损失(但我想象的并不多).
我有点像可选的方法.并不是每一个Person都会有孩子,所以为什么不让children是nil,直到Person决定安顿下来,养家?
无论如何,我想知道一种方法或另一种方法是否存在任何其他特定的优点或缺点.这是一个反复出现的设计问题.