标签: swift4

从Swift 3.2迁移到Swift 4会导致"无法导入桥接头"错误

由于苹果已经发布了支持Swift 4.0的Xcode 9 beta版.我一直在尝试从Swift 3.2升级我的代码到Swift 4.0.但它一直给我failed to import bridging header错误,而我的项目成功构建.

Xcode错误细节:

转换为当前Swift语法失败

在尝试迁移之前,请确保使用当前配置的Swift版本成功构建所有选定目标.

在将代码库升级到swift 4时,是否有任何人遇到类似的错误.

ios swift4 xcode9

15
推荐指数
1
解决办法
1万
查看次数

如何使UIImage符合Codable?

Swift 4有Codable,真棒.但UIImage默认情况下不符合它.我们怎么做?

我试过singleValueContainerunkeyedContainer

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)

uiimage swift4 codable

15
推荐指数
6
解决办法
8218
查看次数

转换为当前Swift语法失败 - "没有这样的模块"(Swift 4,Xcode 9)

在Xcode 9中,我正在尝试自动转换为Swift 4.它失败并显示以下消息:

在此输入图像描述

转换为当前Swift语法失败
在尝试迁移之前,请确保使用当前配置的Swift版本成功构建所有选定目标.

它抱怨缺少模块.但是当我进行常规构建时,没有问题.不确定这是否相关,但模块(Xcode正在抱怨的模块)已经早先转换为Swift 4(在它自己的项目中).

注意:此处不使用Cocoapods/Carthage.

注意:两个解决方案尝试(并且有效),但没有解决潜在的问题.

  • 一种解决方案是手动进行转换(在构建设置中将Swift版本更改为4并逐个应用Fix-It,直到不再出现构建错误).
  • 另一种解决方案是禁用第三方框架(注释掉所有使用它的代码),执行自动迁移,然后重新启用框架.对于更大的项目,这可能会非常困难.

xcode ios swift swift4 xcode9

15
推荐指数
4
解决办法
8750
查看次数

如何从AVCapturePhoto生成具有正确方向的UIImage?

我正在调用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过时),我确实找到了一件我做错的事情:

  1. 在每次捕获调用(self.capturePhotoOutput.capturePhoto)时,必须与PhotoOutput对象建立连接并更新其方向以匹配拍摄照片时设备的方向.为此,我创建了UIDeviceOrientation的扩展,并在我创建的snapPhoto()函数上使用它来调用捕获例程并等待执行didFinishProcessingPhoto委托方法.我添加了代码的快照,因为这里的代码示例分隔符似乎没有正确显示它们. 在此输入图像描述 在此输入图像描述

更新2 链接到GitHub上的完整项目:https://github.com/agu3rra/Out-Loud

avfoundation avcapturesession swift4 ios11

15
推荐指数
4
解决办法
6399
查看次数

重叠访问'urlComponents',但修改需要独占访问权限

我试图使用与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)

swift swift4 xcode9-beta

14
推荐指数
2
解决办法
1万
查看次数

为什么Swift4会抛出一组UIButton!到[UIButton?]类型?

我今天遇到了一个奇怪的问题.请看这段代码:

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?.为什么?

ios swift swift4

14
推荐指数
2
解决办法
834
查看次数

编程UIButton在Swift 4 Xcode 9 Beta 6中不起作用,无法添加目标

在过去,我以编程方式创建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'

selector uibutton addtarget swift4 xcode9-beta

13
推荐指数
1
解决办法
2万
查看次数

在Swift 4中,无法覆盖扩展声明

我最近将我的代码迁移到了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类定义本身中被重写.不过,它正在给出错误.

extension-methods ios swift swift4

13
推荐指数
3
解决办法
9742
查看次数

Swift 4 Label属性

我正在从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)

nsattributedstring uilabel ios swift swift4

13
推荐指数
2
解决办法
3万
查看次数

Swift可解码可选键

(这是此问题的后续跟进:使用具有多个键的可解码协议.)

我有以下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个例子都有效?是否有类似的东西decodeIfPresentnestedContainer

json ios swift swift4 codable

13
推荐指数
2
解决办法
9811
查看次数