Xcode 使用椰子荚混合Swift3和Swift4荚

Xcode 使用椰子荚混合Swift3和Swift4荚,xcode,swift3,cocoapods,swift4,Xcode,Swift3,Cocoapods,Swift4,使用cocoapod时,大多数pod仍然是swift3pod,但在Xcode中导入时,所有pod都默认为swift4,这使得编译步骤失败 我如何在我的pod文件中将Swift4 pod与传统Swift3 pod一起使用,而不必手动更改我所有pod的目标swift版本?iOS 11即将发布,你想用Xcode9测试你的应用程序,你会遇到一个小问题(但很重要):不是所有pod在第一天都是swift 4(或者永远都是!) 在您的私有播客(或开源的公共播客)中,您应该添加: Pod::Spec.new d

使用cocoapod时,大多数pod仍然是swift3pod,但在Xcode中导入时,所有pod都默认为swift4,这使得编译步骤失败


我如何在我的pod文件中将Swift4 pod与传统Swift3 pod一起使用,而不必手动更改我所有pod的目标swift版本?

iOS 11即将发布,你想用Xcode9测试你的应用程序,你会遇到一个小问题(但很重要):不是所有pod在第一天都是swift 4(或者永远都是!)

在您的私有播客(或开源的公共播客)中,您应该添加:

Pod::Spec.new do |s|
    s.pod_target_xcconfig = { 'SWIFT_VERSION' => '3.2' }
    s.compiler_flags = '-swift-version 3.2'
end
任何进口这些吊舱的人都可以从盒子里得到正确的Swift版本,而不需要任何特殊的东西

我希望我能修改所有的播客,但我没有这个能力。但这可以在你的pod文件中修复,只需将你所有的pod默认为swift3.2即可


post_install do |installer|
    installer.pods_project.targets.each do |target|
        target.build_configurations.each do |config|
            config.build_settings['SWIFT_VERSION'] = '3.2'
        end
    end
end
然而,你可能和我一样,将你的应用程序与私有的pod分开(代码重用很好!),你可能会将这些pod转换成Swift 4。现在你想混合这两种类型



同样,在播客文件中,使用以下命令:

post_install do |installer|
    ['TargetName1','TargetName2','TargetName3'].each do |targetName|
        targets = installer.pods_project.targets.select { |target| target.name == targetName }
        target = targets[0]
        target.build_configurations.each do |config|
            config.build_settings['SWIFT_VERSION'] = '4.0'
        end
    end
end
你完了!最终,您的所有POD都将迁移到Swift4,您可以恢复正常使用CoCoaPOD


Cocoapod(从v1.3.1开始)尚未支持混合Swift 3.2和Swift 4

解决方法是可能的。将其附加到
pod文件
,并将已经是Swift 4的pod添加到阵列
swift4Targets
,然后
pod安装

# Workaround Cocoapods to mix Swift 3.2 and 4
# Manually add to swift4Targets, otherwise assume target uses Swift 3.2
swift4Targets = ['MyTarget1', 'MyTarget2']
post_install do |installer|
    installer.pods_project.targets.each do |target|
        target.build_configurations.each do |config|
            if swift4Targets.include? target.name
                config.build_settings['SWIFT_VERSION'] = '4'
            else
                config.build_settings['SWIFT_VERSION'] = '3.2'
            end
        end
    end
end

我是这样做的。所以现在除了2个吊舱外,所有吊舱都在使用Swift 3.2

post_install do |installer|
    installer.pods_project.targets.each do |target|
        target.build_configurations.each do |configuration|
            configuration.build_settings['SWIFT_VERSION'] = "3.2"
        end
    end

    installer.pods_project.targets.each do |target|
        if ['MapboxCoreNavigation', 'MapboxNavigation'].include? target.name
            target.build_configurations.each do |config|
                config.build_settings['SWIFT_VERSION'] = '4.0'
            end
        end
    end
end

我可以确认
post_安装
方法有效。但是,在podspec中设置
pod\u target\u xcconfig
并没有成功。在我的例子中,我有一个Swift 3.2项目正在导入一个Swift 4吊舱。Cocoapods似乎总是使用Xcode目标“Swift Version”并覆盖由
pod\u Target\u xcconfig
定义的“Swift\u Version”。请尝试添加s.compiler\u标志='-Swift Version 3.2',看看这是否奏效。