由于苹果已经发布了支持Swift 4.0的Xcode 9 beta版.我一直在尝试从Swift 3.2升级我的代码到Swift 4.0.但它一直给我failed to import bridging header错误,而我的项目成功构建.
Xcode错误细节:
转换为当前Swift语法失败
在尝试迁移之前,请确保使用当前配置的Swift版本成功构建所有选定目标.
在将代码库升级到swift 4时,是否有任何人遇到类似的错误.
Swift 4有Codable,真棒.但UIImage默认情况下不符合它.我们怎么做?
我试过singleValueContainer和unkeyedContainer
extension UIImage: Codable {
// 'required' initializer must be declared directly in class 'UIImage' (not in an extension)
public required init(from decoder: Decoder) throws {
let container = try decoder.singleValueContainer()
let data = try container.decode(Data.self)
guard let image = UIImage(data: data) else {
throw MyError.decodingFailed
}
// A non-failable initializer cannot delegate to failable initializer 'init(data:)' written with 'init?'
self.init(data: data)
}
public func encode(to encoder: Encoder) throws {
var …Run Code Online (Sandbox Code Playgroud) 在Xcode 9中,我正在尝试自动转换为Swift 4.它失败并显示以下消息:
转换为当前Swift语法失败
在尝试迁移之前,请确保使用当前配置的Swift版本成功构建所有选定目标.
它抱怨缺少模块.但是当我进行常规构建时,没有问题.不确定这是否相关,但模块(Xcode正在抱怨的模块)已经早先转换为Swift 4(在它自己的项目中).
注意:此处不使用Cocoapods/Carthage.
注意:两个解决方案尝试(并且有效),但没有解决潜在的问题.
我正在调用AVFoundation的委托方法来处理照片捕获,但是我很难将它生成的AVCapturePhoto转换为具有正确方向的UIImage.虽然下面的例程是成功的,但我总是得到一个面向右侧的UIImage(UIImage.imageOrientation = 3).使用UIImage(数据:图像)并尝试首先使用photo.cgImageRepresentation()时,我无法提供方向?takeRetainedValue()也没有帮助.请协助.
在此处,图像方向至关重要,因为生成的图像将被输入Vision框架工作流程.
func photoOutput(_ output: AVCapturePhotoOutput, didFinishProcessingPhoto photo: AVCapturePhoto, error: Error?) {
// capture image finished
print("Image captured.")
if let imageData = photo.fileDataRepresentation() {
if let uiImage = UIImage(data: imageData){
// do stuff to UIImage
}
}
}
Run Code Online (Sandbox Code Playgroud)
更新1: 阅读Apple的Photo Capture编程指南(iOS11过时),我确实找到了一件我做错的事情:

更新2 链接到GitHub上的完整项目:https://github.com/agu3rra/Out-Loud
我试图使用与iOS 11和Swift 4的Lyft API,并在第二行收到错误,这是
重叠访问'urlComponents',但修改需要独占访问; 考虑复制到局部变量.
我不确定这意味着什么,以及如何绕过它.任何帮助表示赞赏,谢谢!
let queryItems = parameters
.sorted { $0.0 < $1.0 }
.flatMap { components(forKey: $0, value: $1) }
var urlComponents = URLComponents(url: mutableURLRequest.url!, resolvingAgainstBaseURL: false)
urlComponents?.queryItems = (urlComponents?.queryItems ?? []) + queryItems //error here
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?.为什么?
在过去,我以编程方式创建UIButton没有问题,但自从我使用Xcode 9和Swift 4以来,我找不到让这个错误消失的方法.
//Adding target to UIButton
func PositionStartButton(xOffset: Float){
StartButton.frame = CGRect(x: Int(0 - 40 + xOffset), y: 0, width: 80, height: 80)
StartButton.setImage(#imageLiteral(resourceName: "Logo_Final_WHITE_Face"), for: .normal)
StartButton.addTarget(self, action: "pressButton:", for: .touchUpInside)
ScrollView.addSubview(StartButton)
}
//The target function
func pressButton(_ sender: UIButton){
print("\(sender)")
}
Run Code Online (Sandbox Code Playgroud)
错误消息:'NSInvalidArgumentException',原因:' - [Playing.MainMenuViewController pressButton:]:无法识别的选择器发送到实例0x10440a6b0'
我最近将我的代码迁移到了Swift 4.我面临扩展问题,即
来自扩展的声明无法覆盖
我已经阅读了多个重新发布此问题的帖子.但他们都没有接受下面描述的情景:
class BaseCell: UITableViewCell
{
//Some code here...
}
extension BaseCell
{
func isValid() -> String?
{
//Some code here...
}
}
class SampleCell: BaseCell
{
//Some code here...
override func isValid() -> String? //ERROR..!!!
{
//Some code here...
}
}
Run Code Online (Sandbox Code Playgroud)
根据Apple的说法,
扩展可以为类型添加新功能,但它们不能覆盖现有功能.
但在上面的场景中,我没有覆盖isValid()扩展中的方法.它在SampleCell类定义本身中被重写.不过,它正在给出错误.
我正在从swift 3转到swift 4.我有UILabels,我给标签提供了非常具体的文本属性.初始化strokeTextAttributes时,我在获取"意外发现nil时解包可选值"错误.坦白说,我完全迷失了.
在swift 3中,strokeTextAttributes是[String:Any],但是swift 4引发了错误,直到我将其更改为下面的内容.
let strokeTextAttributes = [
NSAttributedStringKey.strokeColor.rawValue : UIColor.black,
NSAttributedStringKey.foregroundColor : UIColor.white,
NSAttributedStringKey.strokeWidth : -2.0,
NSAttributedStringKey.font : UIFont.boldSystemFont(ofSize: 18)
] as! [NSAttributedStringKey : Any]
chevronRightLabel.attributedText = NSMutableAttributedString(string: "0", attributes: strokeTextAttributes)
Run Code Online (Sandbox Code Playgroud) (这是此问题的后续跟进:使用具有多个键的可解码协议.)
我有以下Swift代码:
let additionalInfo = try values.nestedContainer(keyedBy: UserInfoKeys.self, forKey: .age)
age = try additionalInfo.decodeIfPresent(Int.self, forKey: .realage)
Run Code Online (Sandbox Code Playgroud)
我知道如果我使用decodeIfPresent并且没有该属性,如果它是一个可选变量,它仍将正确处理它.
例如,以下JSON使用上面的代码解析它.
{
"firstname": "Test",
"lastname": "User",
"age": {"realage": 29}
}
Run Code Online (Sandbox Code Playgroud)
以下JSON也适用.
{
"firstname": "Test",
"lastname": "User",
"age": {"notrealage": 30}
}
Run Code Online (Sandbox Code Playgroud)
但以下不起作用.
{
"firstname": "Test",
"lastname": "User"
}
Run Code Online (Sandbox Code Playgroud)
我怎样才能使所有3个例子都有效?是否有类似的东西decodeIfPresent了nestedContainer?