从beta 8.3开始,zillions警告"字符串插值会为可选值生成调试描述;你的意思是明确说明吗?" 出现在我的代码中.
例如,警告在以下情况下弹出,其中选项可能导致nil:
let msg = "*** Error \(options["taskDescription"]): cannot load \(sUrl) \(error)"
Run Code Online (Sandbox Code Playgroud)
如前所述,我(和编译器)可以将选项插值为'nil'.但是编译器改变了主意.
编译器建议添加一个带有描述的String构造函数,如下所示:
let msg = "*** Error \(String(describing: options["taskDescription"])): cannot load \(sUrl) \(error)"
Run Code Online (Sandbox Code Playgroud)
显然,结果是明确的,但在我看来也非常麻烦.有更好的选择吗?我是否必须修复所有警告或更好等待下一个测试版?
我今天遇到了一个奇怪的问题.请看这段代码:
class A {
var button1: UIButton!
var button2: UIButton!
func foo() {
let array = [button1, button2]
}
}
Run Code Online (Sandbox Code Playgroud)
Xcode说这array是[UIButton?]类型.出于某种原因,Swift4将UIButton!元素转换为UIButton?.为什么?
从Swift 3.0开始,我对字符串有一些麻烦,尤其是连接.第一个例子是我开始使用Swift来定义我的url字符串时使用的.
internal let host: String! = "https://host.io/"
let urlString = "\(host)oauth/access_token"
Run Code Online (Sandbox Code Playgroud)
其中host被定义为类的开头.这完美地工作直到Swift 3.0,现在打印出来像这样:
Optional("https://host.io/")oauth/access_token
Run Code Online (Sandbox Code Playgroud)
这很奇怪.现在我必须写这个
let urlString = host + "oauth/access_token"
Run Code Online (Sandbox Code Playgroud)
获得预期的输出.
https://host.io/oauth/access_token
Run Code Online (Sandbox Code Playgroud)
另一个 - 我想我和Strings有类似的问题就是这个.我再次连接字符串,但这次我使用+ilke和urlString - 但这次不起作用.代码行如下所示:
self.labelName.text = currentUser.name + " " + String(describing: ageComponents.year)
Run Code Online (Sandbox Code Playgroud)
不幸的是,它产生了这样的字符串:"我的名字可选(26)".在这种情况下,我没有一个解决方案String(describing: ageComponents.year)是不可选的,它不允许我做的事情String(describing: ageComponents.year) ?? "whatever"
有人见过类似的东西?
我想明白为什么ImplicitlyUnwrappedOptional当我这样做时我没有params["bar"] = str得到但是当我params用相同的力量解包变量声明时我得到它.
看下面的游乐场:
import UIKit
var str: String!
str = "Hello"
var params: [String: Any] = [
"foo": str
]
params["bar"] = str
print(params)
// ["bar": "Hello", "foo": Swift.ImplicitlyUnwrappedOptional<Swift.String>.some("Hello")]
Run Code Online (Sandbox Code Playgroud) 在Xcode 8发布版本中,我发现了一个奇怪的场景.
这是代码,
let implicitlyUnwrappedOptionalString: String! = "implicitlyUnwrappedOptionalString"
let foo = implicitlyUnwrappedOptionalString
print(implicitlyUnwrappedOptionalString)
print(foo)
Run Code Online (Sandbox Code Playgroud)
这是结果:
implicitlyUnwrappedOptionalString
Optional("implicitlyUnwrappedOptionalString")
Run Code Online (Sandbox Code Playgroud)
上面的这些表明,当我将一个隐式展开的可选项分配给一个没有显式类型的变量时,该类型将被推断为一个可选类型,而不是它最初的类型,也就是隐式展开的可选类型.
我的Xcode已更新为8.任何人都可以验证Xcode 7.x中的行为吗?
更改是由于Swift版本更改还是Xcode?
如果我在我的类中声明了一个隐式解包的可选项,然后我在Dictionary类型中引用[String : Any]它,它就不会被解包.为什么是这样?为什么Any,这不是可选的,不强迫它打开?
var aString: String! = "hello"
var params : [String : Any] = [
"myString" : aString
]
print(params)
// This prints ["myString": Swift.ImplicitlyUnwrappedOptional<Swift.String>.some("hello")]
Run Code Online (Sandbox Code Playgroud)
请注意,如果我将字典指定为类型[String : String],它将被解包,但这对于我需要多个类型时没有用Dictionary.
我在一个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 在结构中使用,但没有改变任何东西.因为这不是预期的(如果我是对的)我担心我没有得到完整的概念......请告诉我我的代码/我有什么问题.
我有以下代码:
struct Product {
var image: URL!
var title: String!
var price: Price!
var rating: Float!
var url: URL!
}
struct Price {
var value: Double!
var currency: String! // should be enum
}
Run Code Online (Sandbox Code Playgroud)
我后来初始化了一个Product:
product = Product(
image: URL(string: "...")!,
title: "...",
price: Price(
value: 5.99,
currency: "CAD"
),
rating: 4.5,
url: URL(string: "...")!
)
Run Code Online (Sandbox Code Playgroud)
在运行时期间,product.price类型Price?I发现这很奇怪,因为它是隐式解包的.
我试过给出Price一个init()方法,结果相同.我也试过var price: Price! = Price(value: 0, currency: "CAD")在Product定义中使用,结果相同.(我添加了一个成员初始化器Price …