升级到Swift4.1和Xcode 9.3之后,我得到了上面的运行时消息.在升级之前,我的控制台窗口中没有此消息.
状态栏找不到缓存的时间字符串图像.渲染过程中.
只要我运行App,每隔几分钟就会出现一次.
它看到我没有负面的副作用,我的应用程序运行,像往常一样,我没有看到任何问题.
我使用标准状态栏,没有改变以任何方式修改它.
问题1:在我尚未遇到的情况下,是否会出现此警告的问题?
问题2:有谁知道如何摆脱这个警告?
更新到Xcode 9.3(使用Swift 4.1)后,发现以下问题:
创建一个空项目,向其添加一个新的.swift文件并创建两个新类:
class CodableOne: Codable {
let some: String
}
class CodableTwo: Codable {
var some: String
}
Run Code Online (Sandbox Code Playgroud)
建立成功
添加CodableOne
类型的新常量CodableTwo
:
class CodableOne: Codable {
let some: String
let another: CodableTwo
}
class CodableTwo: Codable {
var some: String
}
Run Code Online (Sandbox Code Playgroud)
建立成功
现在将类移动CodableTwo
到另一个文件(例如ViewController.swift)
构建失败.
现在有一个错误,它不会消失.Codable
类不应该需要初始化器(如前面的步骤所示).
关于这背后可能出现的问题及如何解决的任何想法将不胜感激!
PS Code在Xcode 9.2中不存在.也不清理项目/构建路径,重新安装Xcode 9.3也有帮助.
似乎在Swift 4.1 flatMap
中已弃用.然而,Swift 4.1中 有一个新方法,compactMap
它做同样的事情?有了flatMap
你可以集合中变换的每个对象,然后删除在无任何项目.
像flatMap一样
let array = ["1", "2", nil]
array.flatMap { $0 } // will return "1", "2"
Run Code Online (Sandbox Code Playgroud)
就像compactMap一样
let array = ["1", "2", nil]
array.compactMap { $0 } // will return "1", "2"
Run Code Online (Sandbox Code Playgroud)
compactMap
正在做同样的事情.
这两种方法有什么区别?为什么Apple决定重命名该方法?
我在Xcode 9.4中构建项目时遇到了奇怪的错误
Build system information - unexpected service error: The Xcode build system has crashed. Please close and reopen your workspace.
Run Code Online (Sandbox Code Playgroud)
我尝试了Xcode退出并重新打开但是没有用.有解决方案吗
有人可以解释为什么@objc
这里需要关键字来编译代码吗?
据我所知,这个关键字用于工作ObjC消息方法调度.但这不是一个NSObject
例子.
class MyClass {
}
extension MyClass {
@objc func extensionMethod() { /// THIS LINE
print("A")
}
}
class SubClass: MyClass {
override func extensionMethod() {
print("B")
}
}
Run Code Online (Sandbox Code Playgroud)
@objc
关键字是否启用消息调度以及dynamic
?或不?
Swift 4.2 有一个特殊的条件canImport
,可以帮助开发者检查一个模块是否可以导入到项目中。它是在 Swift 4.1 中引入的。
现在我正在研究用 Objective-C 编写的 iOS 项目。我使用模块,对于每个目标,这些模块都是不同的。这就是为什么我想使用这样的东西:
#if canImport(SomeModule)
@import SomeModule;
#endif
Run Code Online (Sandbox Code Playgroud)
我怎么解决这个问题?现在我为每个目标使用不同的“其他 C 标志”,但我想找到更灵活的解决方案。
请考虑以下代码段:
var a: String? = "abc"
var b: String?
let result = [a, b].compactMap { $0 }
Run Code Online (Sandbox Code Playgroud)
执行后,result
将会
["abc"]
Run Code Online (Sandbox Code Playgroud)
这是预期的结果.这里的result(ElementOfResult
)元素是String
.
print(type(of: result))
Array<String>
Run Code Online (Sandbox Code Playgroud)
现在到了有趣的部分.将代码段更改为
var a: String? = "abc"
var b: Int?
let result = [a, b].compactMap { $0 }
Run Code Online (Sandbox Code Playgroud)
并执行它,result
将是
[Optional("abc"), nil]
Run Code Online (Sandbox Code Playgroud)
结果的元件(ElementOfResult
)这里是Any
这是有意义的,因为Any
是的公分母String
和Int
.
print(type(of: result))
Array<Any>
Run Code Online (Sandbox Code Playgroud)
为什么nil
返回的结果compactMap
与其定义相矛盾?
来自Apple的compactMap
文档
compactMap(_ :)
返回一个数组,其中包含使用此序列的每个元素调用给定转换的非零结果.
宣言
func compactMap(_ transform:(Self.Element)throws …
当我在模拟器中运行我的应用程序时,我在Xcode中收到此警告.我该怎么做才能摆脱它?
objc[6529]: Class VCWeakObjectHolder is implemented in both /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/AVConference.framework/Frameworks/ViceroyTrace.framework/ViceroyTrace (0x13490b4d0) and /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/AVConference.framework/AVConference (0x133a37e38). One of the two will be used. Which one is undefined.
Run Code Online (Sandbox Code Playgroud)
在Internet上找不到'Class VCWeakObjectHolder'的单一引用.这让我疯了......虽然这只是一个警告.
更新:Xcode 9.3.1和Xcode 9.4 beta都给出了相同的警告.
在以前的版本中,为了从[String: Any]
字典中获取浮点值,我可以使用let float = dict["somekey"] as? Float
,但在swift4.1中,它不起作用.看来类型dict["somekey"]
已经隐含推断为Double
之前,我得到它,所以从铸造Double
到Float
总是失败.我想知道这是一个新特征还是一个bug.
- 这是更新.
我重新下载了一个Xcode9.2并做了一些实验,现在我想我弄清楚发生了什么.这是测试代码:
let dict: [String : Any] = ["key": 0.1]
if let float: Float = dict["key"] as? Float {
print(float)
} else {
print("nil")
}
let dict1: [String : Any] = ["key": NSNumber(value: 0.2)]
if let float: Float = dict1["key"] as? Float {
print(float)
} else {
print("nil")
}
let number = NSNumber(value: 0.3)
if let float: Float = number …
Run Code Online (Sandbox Code Playgroud) 我从服务器(或文件)获取 JSON 字符串。
我想解析那个 JSON 字符串并动态找出每个值类型。
然而,当涉及到布尔值,JSONSerialization
只需将值转换为0
或1
,并且代码不能区分是否为“0”是一个Double
,Int
或Bool
。
我想在Bool
不明确知道特定键对应于Bool
值的情况下识别该值是否为 a 。我做错了什么,或者我可以做些什么不同的事情?
// What currently is happening:
let jsonString = "{\"boolean_key\" : true}"
let jsonData = jsonString.data(using: .utf8)!
let json = try! JSONSerialization.jsonObject(with: jsonData, options: .mutableContainers) as! [String:Any]
json["boolean_key"] is Double // true
json["boolean_key"] is Int // true
json["boolean_key"] is Bool // true
// What I would like to happen is below (the issue …
Run Code Online (Sandbox Code Playgroud)