Can't build SwiftFoundation: Value of type 'String' has no member '_guts'

I’m attempting to build SwiftFoundation using XCode 9.3. I’ve downloaded and am using the Swift 4.1 Toolchain. (Toolchain: Swift 4.1 Release 2018-03-29 (a))

I’m attempting to follow the instructions from Docs/GetttingStarted.md in the swift-corelibs-foundation repo.

I’ve tried to compile the latest which is from Mon Apr 2 commit 4deff496. I’ve also attempted to compile a development snapshot swift-corelibs-foundation-swift-DEVELOPMENT-SNAPSHOT-2018-03-31-a

Both the current and the snapshot fail to build with 4 errors all the same message:

Value of type ‘String’ has no member ‘_guts’

in NSString in these methods:

    internal func _fastCStringContents(_ nullTerminated: Bool) -> UnsafePointer<Int8>? {
        if type(of: self) == NSString.self || type(of: self) == NSMutableString.self {
            if _storage._guts._isContiguousASCII {
                return unsafeBitCast(_storage._core.startASCII, to: UnsafePointer<Int8>.self)
            }
        }
        return nil
    }
    
    internal var _fastContents: UnsafePointer<UniChar>? {
        if type(of: self) == NSString.self || type(of: self) == NSMutableString.self {
            if _storage._guts._isContiguousUTF16 {
                return UnsafePointer<UniChar>(_storage._core.startUTF16)
            }
        }
        return nil
    }
    
    internal var _encodingCantBeStoredInEightBitCFString: Bool {
        if type(of: self) == NSString.self || type(of: self) == NSMutableString.self {
            return !_storage._guts._isContiguousASCII
        }
        return false
    }


    public func getCString(_ buffer: UnsafeMutablePointer<Int8>, maxLength maxBufferCount: Int, encoding: UInt) -> Bool {
        var used = 0
        if type(of: self) == NSString.self || type(of: self) == NSMutableString.self {
            if _storage._guts._isContiguousASCII {
                used = min(self.length, maxBufferCount - 1)
                _storage._core.startASCII.withMemoryRebound(to: Int8.self,
                                                            capacity: used) {
                    buffer.moveAssign(from: $0, count: used)
                }
                buffer.advanced(by: used).initialize(to: 0)
                return true
            }
        }
        if getBytes(UnsafeMutableRawPointer(buffer), maxLength: maxBufferCount, usedLength: &used, encoding: encoding, options: [], range: NSRange(location: 0, length: self.length), remaining: nil) {
            buffer.advanced(by: used).initialize(to: 0)
            return true
        }
        return false
    }

I see this member _guts was introduced recently in #1484.

Have I gone too quickly and overlooked some steps in the GettingStarted? Am I using the wrong ToolChain for latest code?

/cc @Michael_Ilseman

The _guts property has been available for a few dozen snapshots, beginning with swift-DEVELOPMENT-SNAPSHOT-2018-01-25-a.

@michaelgwelch, are you sure you also switched your toolchain in Xcode (Xcode->Toolchains->…)? You may need to restart Xcode and/or clean your build, @Tony_Parker would know more.

edit: You need a development snapshot. See https://swift.org/download/#snapshots

Yes, thanks, that was it. I did indeed go too quickly thru the Getting Started. I saw the Released versions of the toolchain and just assumed that would be what I needed. At the time I didn’t scroll down to see the development snapshots.